Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在libgdx中将纹理拆分为拼图块_Java_Android_Bitmap_Opengl Es_Libgdx - Fatal编程技术网

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

Java 在libgdx中将纹理拆分为拼图块,java,android,bitmap,opengl-es,libgdx,Java,Android,Bitmap,Opengl Es,Libgdx,由于性能问题,我正在尝试将基于android画布的游戏转换为Libgdx。目前我面临的问题,当我不得不生成拼图拼图精灵(动态) 我所做的:我使用android位图操作(路径和PorterDuff)生成拼图块,然后将其输入AndroidLauncher中的Libgdx游戏对象 问题1:在libgdx核心项目中,是否有更好的方法将位图转换为拼图块。(见下文) 问题2:如何创建一个区域来表示拼图块。 (边界框或基于宽度/高度的解决方案不适用),因此用户可以在仅接触该纹理区域时拖动该块 问题3:检测相

由于性能问题,我正在尝试将基于android画布的游戏转换为Libgdx。目前我面临的问题,当我不得不生成拼图拼图精灵(动态)

我所做的:我使用android位图操作(路径和PorterDuff)生成拼图块,然后将其输入AndroidLauncher中的Libgdx游戏对象

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

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


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

在LibGdx中创建拼图游戏的最佳方法。有一种替代方法可以通过使用遮罩从LibGdx中的图像中获得片段。遮罩是通过创建一个着色器程序来实现的,即对于这个问题,我们必须编写一个 1.顶点着色器 2.碎片着色器 3.创建一个着色器程序 4.创建自定义雪碧批次。 有关着色器的详细信息:

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

  • 顶点着色器:顶点着色器负责对顶点执行操作

    ` 统一的mat4 u_项目

    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.片段着色器:片段着色器的功能与顶点着色器非常相似。但不是在顶点上处理它,而是为每个片段处理一次

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

    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.用于掩蔽的定制雪碧批次:

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

    无着色器:

    在LibGdx中创建拼图游戏的最佳方法。有一种替代方法可以通过使用遮罩从LibGdx中的图像中获得片段。遮罩是通过创建一个着色器程序来实现的,即对于这个问题,我们必须编写一个 1.顶点着色器 2.碎片着色器 3.创建一个着色器程序 4.创建自定义雪碧批次。 有关着色器的详细信息:

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

  • 顶点着色器:顶点着色器负责对顶点执行操作

    ` 统一的mat4 u_项目

    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.片段着色器:片段着色器的功能与顶点着色器非常相似。但不是在顶点上处理它,而是为每个片段处理一次

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

    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.用于掩蔽的定制雪碧批次:

        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:

    我认为这很难通过代码实现。难道你不能画出每一个拼图块并创建一个函数来画出每一个拼图块并使大图像消失吗?你可能希望看到使用box 2d和rube editor进行触摸检测和碰撞。(如果你想让它们精确的话)你可以使用阿尔法面具。谢谢你的回复。你能告诉我更多的信息吗。还有如何解决问题2和3。我认为这将很难通过代码实现。难道你不能画出每一个拼图块并创建一个函数来画出每一个拼图块并使大图像消失吗?你可能希望看到使用box 2d和rube editor进行触摸检测和碰撞。(如果你想让它们精确的话)你可以使用阿尔法面具。谢谢你的回复。你能告诉我更多的信息吗。还有如何解决问题2和问题3。另外请看:<>另外请看:<>