gpt4 book ai didi

java - 在 libgdx 中将纹理分割成拼图

转载 作者:太空宇宙 更新时间:2023-11-04 11:08:07 27 4
gpt4 key购买 nike

由于性能问题,我正在尝试将基于 Android Canvas 的游戏转换为 Libgdx。目前,当我必须(动态)生成拼图 fragment Sprite 时,我遇到了问题。

我做了什么:我使用了 android 位图操作(Path 和 PorterDuff)并生成了拼图 block ,然后将其提供给 AndroidLauncher 中的 Libgdx Game 对象。

问题 1:是否有更好的方法将位图转换为 libgdx 核心项目中的拼图。 (见下文)

enter image description here

问题 2:如何创建一个区域来代表拼图 block 。(边界框或基于宽度/高度的解决方案不合适),以便用户在仅触摸该纹理区域时可以拖动该 block 。

问题 3:检测用户何时将相邻拼图彼此移近的最佳方法。

最佳答案

在 LibGdx 中创建拼图游戏的最佳方式。还有一种替代方法可以通过使用掩码从 LibGdx 中的图像中获取 fragment 。遮蔽是通过创建着色器程序来实现的,即对于这个问题,我们必须编写一个1.顶点着色器2. fragment 着色器3.创建着色器程序4.创建自定义 Sprite 批处理。有关着色器的更多信息:https://github.com/libgdx/libgdx/wiki/Shaders

着色器程序如下所示:下面的顶点着色器用于 mask :-

  1. 顶点着色器:顶点着色器负责对顶点执行操作。

    ` 统一mat4 u_projTrans;

    attribute vec4 a_position;

    attribute vec4 a_color;

    attribute vec2 a_texCoord0;

    varying vec4 v_color;
    varying vec2 v_texCoord0;

    void main()
    {
    v_color = a_color;
    v_texCoord0 = a_texCoord0;
    gl_Position = u_projTrans * a_position;
    } `

2. fragment 着色器: fragment 着色器的功能与顶点着色器非常相似。但它不是在顶点上处理它,而是为每个 fragment 处理一次。

`#ifdef GL_ES
precision mediump float;
#endif

uniform sampler2D u_texture;
uniform sampler2D u_mask;

varying vec4 v_color;
varying vec2 v_texCoord0;

void main()
{
vec4 texColor = texture2D(u_texture, v_texCoord0);
vec4 mask = texture2D(u_mask, v_texCoord0);
texColor.a *= mask.a;
gl_FragColor = v_color * texColor;
}`
  • 使用顶点和 fragment 着色器创建着色器程序:

    public class MyShader {
    private FileHandle fragmentShader = Gdx.files.internal("fragment.glsl");
    private FileHandle vertexShader = Gdx.files.internal("vertex.glsl");
    public ShaderProgram myShader = new ShaderProgram(this.vertexShader,
    this.fragmentShader);

    public MyShader () {
    this.myShader .begin();
    this.myShader .setUniformi("u_texture", 0);
    this.myShader .setUniformi("u_mask", 1);
    this.myShader .end();
    }

    }

  • 4.用于 mask 的自定义 Sprite 批处理:

        batch.setShader(MyShader.myShader);
    this.alphaTexture.bind(1);
    this.color.getTexture().bind(0);
    batch.enableBlending();
    Color c = getColor();
    batch.draw(this.color, getX(), getY(), getOriginX(),
    getOriginY(),
    getWidth(), getHeight(), getScaleX(), getScaleY(), 0.0f);
    batch.setShader(null);

    着色器类(class):https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson2

    关于java - 在 libgdx 中将纹理分割成拼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46271718/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com