将纹理拆分为拼图块在libgdx中

时间:2017-09-18 04:42:00

标签: java android bitmap opengl-es libgdx

由于性能问题,我试图将基于Android Canvas的游戏转换为Libgdx。目前,当我必须(动态地)生成拼图拼图时,我正面临着一些问题。

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

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

enter image description here

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

问题3 :检测用户将相邻拼图移动到彼此的最佳方式。

1 个答案:

答案 0 :(得分:0)

在LibGdx中创建拼图益智游戏的最佳方式。有一种替代方法可以通过使用遮罩来实现LibGdx中Image的碎片。通过创建着色器程序来实现屏蔽,即对于这个问题,我们必须编写一个 1.Vertex Shader 2.Fragment Shader 3.创建着色器程序 4.创建自定义精灵批处理。 有关着色器的更多信息:https://github.com/libgdx/libgdx/wiki/Shaders

着色器程序如下所示: 在顶点着色器下方进行蒙版: -

  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. 2.Fragment Shader:片段着色器以与顶点着色器非常相似的方式运行。但是不是在顶点上处理它,而是为每个片段处理一次。

    `#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;
    }`
    
    1. 使用Vertex和片段着色器创建着色器程序:

      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();
      }
      

      }

    2. 4.用于屏蔽的自定义精灵批次:

          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);
      

      ShaderLesson:https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson2