0

2D 横スクロール ゲームを開発しています。背景用にサイズ 2400x480 のタイル ビットマップがあります。このビットマップをスクロールするにはどうすればよいですか?

私は次のコードでそれを行うことができることを知っています:

for(int i=0;i<100;i++)
draw(bitmap,2400*i,480);

したがって、ビットマップを 240000 ピクセル分スクロールします。

しかし、画面からはみ出す画像 (サイズ 800x480) を描画したくありません。

スクロール タイルをレンダリングするにはどうすればよいですか?速度を与えるにはどうすればよいですか?(通常のスクロール後の視差スクロールの場合)

4

2 に答える 2

0

シェーダーの操作に問題がない場合は、よりクリーンな方法を使用できるため、より効率的な方法である可能性があります。

画面全体をカバーするクワッドでVBOを作成します。幅と高さはそれぞれ800と480である必要があります。

次に、頂点シェーダーを次のように作成します。

attribute vec4 vPos;
uniform int shift;
varying mediump vec2 fTexCoord;
void main(void){
   gl_Position = vPos;
   fTexCoord = vec2((vPos.x-shift)/800.0, vPos.y/480.0);//this logic might change slightly based on which quadarnt you choose.
}

フラグメントシェーダーは次のようになります。

precision mediump float;
uniform sampler2D texture;    
varying mediump vec2 fTexCoord;
void main(void){
   gl_FragColor = texture2D(texture, fTexCoord);
}

これで完了です。スクロールするには、「glUniformX()」APIを使用して均一な値を設定するだけです。

于 2012-05-02T07:42:13.947 に答える
0

次のコードは、2 つのクワッドではなく 1 つのクワッドを使用し、それに応じてテクスチャ座標を調整します。すべてのテクスチャ処理コードを取り除いたことに注意してください。射影行列には のみが含まれますglOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);Quad2Dを使用して tex 座標をアニメーション化できるクワッドを定義しますupdateTexCoords

static class Quad2D {
    public Quad2D() {
        /* SNIP create buffers */
        float[] coords = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, };
        mFVertexBuffer.put(coords);
        float[] texs = { 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, };
        mTexBuffer.put(texs);
        /* SNIP reposition buffer indices */
    }

    public void updateTexCoords(float t) {
        t = t % 1.0f;
        mTexBuffer.put(0, 0.33f+t);
        mTexBuffer.put(2, 0.0f+t);
        mTexBuffer.put(4, 0.33f+t);
        mTexBuffer.put(6, 0.0f+t);
    }

    public void draw(GL10 gl) {
        glVertexPointer(2, GL_FLOAT, 0, mFVertexBuffer);
        glTexCoordPointer(2, GL_FLOAT, 0, mTexBuffer);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    }
    /* SNIP members */
}

今どのように呼び出すのupdateTexCoordsですか?内onDrawFrameに、次のコードを入れます。

    long time = SystemClock.uptimeMillis() % 3000L;
    float velocity = 1.0f / 3000.0f;
    float offset = time * velocity;
    mQuad.updateTexCoords(offset);

テクスチャ座標が を超える1.0fため、S 座標のテクスチャ ラップを に設定する必要がありますGL_REPEAT

于 2012-05-02T07:02:09.233 に答える