【问题标题】:Split a Texture into puzzle pieces In libgdx在 libgdx 中将纹理拆分为拼图
【发布时间】:2017-09-18 04:42:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我认为这很难通过代码实现。难道你不能只绘制每个拼图并创建一个函数来绘制每个拼图并让大图像消失吗?
  • 您可能希望看到使用 box 2d 和 rube 编辑器进行触摸检测和碰撞。 (如果您希望它们准确无误)
  • 你可以使用 alpha 蒙版。
  • 感谢您的回复。你能给我更多的信息吗?以及如何解决问题 2 和 3。

标签: java android bitmap opengl-es libgdx


【解决方案1】:

在 LibGdx 中创建拼图游戏的最佳方式。有一种替代方法可以通过使用遮罩从 LibGdx 中的图像中获取片段。遮罩是通过创建一个着色器程序来实现的,即对于这个问题,我们必须编写一个 1.顶点着色器 2.片段着色器 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.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. 使用顶点着色器和片段着色器创建着色器程序:

    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.Custom Sprite Batch for Masking:

    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

【讨论】:

  • 也看看:github.com/mattdesl/lwjgl-basics/wiki/…>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多