2

パフォーマンスのため、OpenGL ES 2D から OpenGL ES 2D に移行しました。canvas.drawBitmap

これはスプライト シート 4x1 です。

ここに画像の説明を入力

今それを機能させるために、私はクラスに従っていました:

public Vulcan(ScreenObjectsView objectsView, int vulkanSpriteID, Context context) {     

    this.b = BitmapFactory.decodeResource(context.getResources(), vulkanSpriteID);

    // 1x4
    height = b.getHeight();
    width = b.getWidth()/4;

    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    x = display.getWidth()/2-width/2;  // deprecated
    y = display.getHeight()-height;  // deprecated  

}

public void update() {
    frameFreq++;

    if(frameFreq > 0){
        currentFrame = ++currentFrame % 4;
        frameFreq = 0;
    }       
}


@Override
public void draw(Canvas canvas) {
    update();

    int srcX = currentFrame * width;

    Rect  src = new Rect(srcX, 0, srcX+width, height);
    Rect  dst = new Rect(x, y, x+width, y+height);

    canvas.drawBitmap(b, src, dst, null);
}   

Rect私が取り、左から右にシフトする各期間(ループ内):

currentFrame = ++currentFrame % 4;

ここまでは順調ですね。

上記のスプライト シートを OpenGL ES でアニメーション化するにはどうすればよいですか?

今日、私は OpenGL ES でオブジェクトを描画および移動する方法を知っています (良いデモのおかげで)

しかし、スプライトで遊ぶことを知りません。

コードのアイデア、リンク、スニペットはありますか?

[編集]

スプライト シートや次のような 4 つの画像を使用する必要はありません。

ここに画像の説明を入力 などここに画像の説明を入力

それでも答えも方向性も得られないのは奇妙なことです。

ありがとうございました、

[編集2]

Aertの言うことによると、私は次のコードを実装しましたが、動作します。

でもめんどくさいらしい

OpenGL ES のコードが多すぎます。テクスチャごとに (私は 4 つ持っています)、FloatBuffer を作成する必要があります。

多分誰かがより短い道を進んでいるか、私が何か間違ったことをしました。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;

public class DevQuestSpriteBase {

private static final String LOG_TAG = "Fess";//DevQuestSpriteBase.class.getSimpleName();

protected int mFrame = 0;
protected int mSwitcher = 0;
private int textureCount = 1; // frame animation
protected int[] textures = new int[textureCount]; // frame animation

// texture and verts
protected FloatBuffer vertexBuffer,
textureBuffer1,
textureBuffer2,
textureBuffer3,
textureBuffer4;

ByteBuffer bb1;

protected float vertices[] = {
        0f,0f,0.0f,
        1f,0f,0.0f,
        0f,1f,0.0f,
        1f,1f,0.0f
};


/** 1 frame */
protected float texture1[] = {          
        0.0f, 1.0f,     
        0.0f, 0.0f,     
        0.25f, 1.0f,    
        0.25f, 0.0f     
};
/** 2 frame */
protected float texture2[] = {          

        0.25f, 1.0f,        
        0.25f, 0.0f,        
        0.5f, 1.0f,     
        0.5f, 0.0f      
};
/** 3 frame */
protected float texture3[] = {          
        0.5f, 1.0f,     
        0.5f, 0.0f,     
        0.75f, 1.0f,    
        0.75f, 0.0f     
};
/** 4 frame */
protected float texture4[] = { 
        0.75f, 1.0f,        
        0.75f, 0.0f,        
        1.0f, 1.0f,     
        1.0f, 0.0f      
};


public DevQuestSpriteBase(){
    // vertices buffer
    bb1 = ByteBuffer.allocateDirect(vertices.length * 4);
    bb1.order(ByteOrder.nativeOrder());
    vertexBuffer = bb1.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    // texture buffer
    bb1 = ByteBuffer.allocateDirect(texture1.length * 4);
    bb1.order(ByteOrder.nativeOrder());
    textureBuffer1 = bb1.asFloatBuffer();
    textureBuffer1.put(texture1);
    textureBuffer1.position(0);

    //#########################################################

    // texture buffer
    bb1 = ByteBuffer.allocateDirect(texture2.length * 4);
    bb1.order(ByteOrder.nativeOrder());
    textureBuffer2 = bb1.asFloatBuffer();
    textureBuffer2.put(texture2);
    textureBuffer2.position(0);

    //#########################################################

    // texture buffer
    bb1 = ByteBuffer.allocateDirect(texture3.length * 4);
    bb1.order(ByteOrder.nativeOrder());
    textureBuffer3 = bb1.asFloatBuffer();
    textureBuffer3.put(texture3);
    textureBuffer3.position(0);

    //#########################################################

    // texture buffer
    bb1 = ByteBuffer.allocateDirect(texture4.length * 4);
    bb1.order(ByteOrder.nativeOrder());
    textureBuffer4 = bb1.asFloatBuffer();
    textureBuffer4.put(texture4);
    textureBuffer4.position(0);
}


private void update() {

    if(mSwitcher == 5){
        mFrame = ++mFrame % 4;
        mSwitcher = 0;
        // Log.e(LOG_TAG, "DevQuestSpriteBase :: " + mFrame);
    }
    else{
        mSwitcher++; 
    }   


}

public void draw(GL10 gl){

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);


    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    if(mFrame == 0){
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer1);
    }
    else  if(mFrame == 1){
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer2);
    }
    else  if(mFrame == 2){
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer3);
    }
    else  if(mFrame == 3){
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer4);
    }


    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

    //Log.e(LOG_TAG, "DevQuestSpriteBase :: draw"); 

    update();

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    //gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer1);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}


public int[] getTextures() {
    return textures;
}
}
4

1 に答える 1