4

background.png という 1 つの画像があります。Android OpenGL ESまたはAndEngineライブラリ、またはあなたが知っている他のテクノロジーを使用して、連続的に繰り返されるスクロール背景画像を作成する方法は?

例:
動く雲

現在、私は2隣接画像技術を使用しています。画像 (background.png) を 2 回読み込んで、隣接させてから移動します。そのため、連続してスクロールする 1 つの画像のように見えます。

しかし、どういうわけか、1 つのイメージ インスタンスを使用するだけで、より良い解決策があるのではないかと思います。誰でも共有できますか?

更新:
好奇心旺盛な人のために、これは 2 つの隣接する画像コードです (AndEngine ライブラリを使用):

movingBackgroundSprite.registerEntityModifier(new LoopEntityModifier(
    new MoveYModifier(10, -CAMERA_HEIGHT, 0)));     
movingBackgroundSprite2.registerEntityModifier(new LoopEntityModifier(
    new MoveYModifier(10, 0, CAMERA_HEIGHT)));

上記のコードは、背景画像を繰り返し作成し、上から下に垂直にスクロールすることに関するものです。

注:
* movingBackgroundSprite は、background.png 画像をロードする Sprite クラスです。背景のスプライトのインスタンスが 2 つあることがわかります。
* registerEntityModifier -> スプライトの修飾子/動作を適用
* LoopEntityModifier -> ループ動作
* MoveYModifier -> y 位置による移動動作。1 番目の引数は継続時間 (質問とは関係ないので無視してかまいません)、2 番目の引数はソース Y の位置、3 番目の引数は宛先 Y の位置です。
* CAMERA_HEIGHT -> 背景画像の高さを定義する定数。

4

2 に答える 2

4

設定した場合glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)(これがデフォルトだと思います)、フルスクリーンのクワッドを描画し、sテクスチャ座標を小さなステップでインクリメントすることができます (必要に応じて、垂直方向にも機能します)。

1.0 より大きい値は、テクスチャの左側にラップされます。追加の必要はありません。そして、2 つのドローコールは必要ありません。

ES 1.0 と 2.0 のどちらを使用しているかはわかりませんでしたが、2.0 の場合は代わりにオフセットをユニフォームとして渡し、それをシェーダーのテクスチャ座標に追加することができます。これは頂点データ (texcoord) を毎回変更するよりも効率的です。フレーム。1 フレームに 1 回のことですが、おそらくまったく問題にはなりません。おそらく同じです。

EDIT:
AndEngineについては知りません。テクスチャ付きのフルスクリーンクワッドを描画するためのよりシンプルで便利なコマンドがあるかもしれません...しかし、「OpenGL ES 1.0」が与えられ、即時モードを使用し、デフォルトのMVPマトリックスを想定すると、これは次のようになります非常に大まかな例として:

glBindTexture(GL_TEXTURE_2D, cloudy_sky_texture);
glTexImage(...);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
...
float offset = 0.0f;
while(!quit)
{
    offset += 1.0f/texture_size;

    glBindTexture(GL_TEXTURE_2D, cloudy_sky_texture);

    glBegin(GL_QUADS);
        glVertex2f(-1.0f, -1.0f);
        glTexCoord2f(0.0f + offset, 0.0f);
        ...
        glVertex2f(1.0f,  1.0);
        glTexCoord2f(1.0f + offset, 1.0f);
    glEnd();

    DrawForegroundStuff();
}

簡潔にするために一部の行は省略されています。即時モードは適切ではありません。最適化の余地は十分にありますが、原則は明確です。実際には、1 つのクワッドを描画sし、テクスチャ座標のコンポーネントをインクリメントするだけです。

于 2012-04-19T11:12:34.903 に答える
1

答えが見つかったかもしれませんが、他の Andengine ゲーム開発者が背景をスクロール可能にすることに混乱している場合に備えて、使いやすく効率的なAutoParallaxBackgroundを使用することをお勧めします。

AutoParallaxBackground を実装するには、次の手順に従います。

1) BitmapTextureAtlas と TextureRegion を宣言して初期化します。

private BitmapTextureAtlas mAutoParallaxBackgroundTexture;
private TextureRegion background_region;
mAutoParallaxBackgroundTexture = new BitmapTextureAtlas(1024, 1024,TextureOptions.DEFAULT);
background_region= BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mAutoParallaxBackgroundTexture, this,"backgroundImg.png", 0, 0);

2) 背景スプライトと AutoParallaxBackground を宣言して初期化します。

final AutoParallaxBackground auto_background = new AutoParallaxBackground(0, 0, 0, 5);         
final Sprite background_sprite = new Sprite(0,0, this.background_region,vbom);

3)視差エンティティとして background_sprite を AutoParallaxBackground オブジェクトに追加します。

auto_background.attachParallaxEntity(new ParallaxEntity(1.7f,background_sprite));

4)最後に、AutoParallaxBackground オブジェクトをシーンの背景として設定します。

your_scene.setBackground(auto_background);

これが後で誰かを助けることを願っています。

于 2015-06-24T08:21:56.877 に答える