2017-09-18 76 views
1

我試圖將基於Android Canvas的遊戲轉換爲Libgdx由於性能問題。目前我面臨的問題是當我必須生成拼圖塊拼圖(動態)時。將紋理拆分成拼圖碎片在libgdx

我做了什麼:我使用了android位圖操作(Path和PorterDuff)並生成了拼圖碎片,然後將其提供給AndroidLauncher中的Libgdx Game對象。

問題1:有沒有更好的方法將位圖轉換爲libgdx核心項目中的拼圖碎片。 (見下文)

enter image description here

問題2:我怎樣才能創建一個區域只表示一塊拼圖。 (以邊界框或寬度/高度爲基礎的解決方案不合適),以便用戶只需觸碰該紋理區域即可拖動該部分。

問題3:檢測相鄰拼圖碎片彼此靠近的最佳方法。

+0

我認爲這很難通過代碼實現。難道你不能只繪製每個拼圖塊並創建一個函數來繪製每個拼圖塊並使大圖像消失嗎? –

+0

你可能想看看使用方框2d和潤色管編輯器進行觸摸檢測和碰撞。 (如果你想讓它們精確) –

+0

你可以使用alpha蒙版。 – Reaper

回答

1

在LibGdx中創建拼圖遊戲的最佳方法。還有一種替代方法可以通過使用遮罩來從LibGdx中的圖像中實現碎片。遮罩是通過創建Shader程序來實現的,即對於這個問題我們必須編寫一個 1.Vertex Shader 2.片段着色器 3.創建着色器程序 4.創建一個自定義的精靈批處理。 對着色器的詳細信息:https://github.com/libgdx/libgdx/wiki/Shaders

着色器程序是這樣的: 下面頂點着色引擎進行屏蔽: -

  1. 頂點着色器:頂點着色負責頂點上執行操作。

    ` uniform 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着色器:在一個非常類似的方式來頂點着色器的片段着色器的功能。但不是在頂點上處理它,而是爲每個片段處理一次。

`#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.Custom雪碧批次爲掩蔽:

    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

    +0

    另請參見: manishkaushik