12

無限にスクロールできる背景が必要な 2D 横スクロール スペース シューティング タイプのゲームを作成しています (タイル張りまたは繰り返しラップ)。視差スクロールも実装したいので、ほとんど動かない最低の背景の星雲テクスチャを 1 つ、ほとんど動かない遠くの星を含む高い背景を、よく動く近くの星を含む最高の背景を用意します。

各レイヤーをその上のレイヤーよりも50%少なく移動させることがGoogleからわかりましたが、これをlibgdxに実装するにはどうすればよいですか? ズームインおよびズームアウトできるカメラがあり、物理的な 800x480 画面では、128x128 ピクセル (船) から、エッジに複数回ラップされたテクスチャを特徴とする巨大な領域まで、あらゆるものを表示できます。

小さいテクスチャ (512x512 など) を無限にタイル張りされているかのように連続的にラップするにはどうすればよいですか (カメラがズームアウトされた場合)。次に、これらのような複数のテクスチャを重ねて、それらを適切な構造にまとめるにはどうすればよいですか? libgdx api の 1 つ?) プレーヤーの座標が変更されると、それらを移動しますか? javadocs と例を見てきましたが、この問題のようなものは見つかりませんでした。明らかな場合は申し訳ありません!

4

4 に答える 4

11

ねえ、私もparrallaxの背景を作成し、それをスクロールさせようとしています。

リポジトリにはParallaxTest.javaがあり、ここにあります。

このファイルはスタンドアロンクラスであるため、必要に応じてゲームに組み込む必要があります。タッチスクリーン/マウスを使用するために接続されているため、コントロール入力を変更する必要があります。

これは私のために働いた。繰り返されるbgについては、まだそれほど進んでいませんが、基本的なロジックが必要だと思います。最後から1画面離れて、最初の数画面を最後に並べるように変更します。

于 2011-09-24T14:11:04.467 に答える
3

パララックス スクロールに関しては、PFG が既に行った以上に言うことはありません。実際、リポジトリの test フォルダーの下に例があり、Web 上のいくつかの説明があります。私はこれが好きでした。背景の問題は本当に簡単に解決できます。この問題およびその他の関連する問題は、剰余代数を使用してアプローチできます。一度見れば非常にわかりやすいので、詳細には触れません。

画面にコンパスを表示したいとします。基点を表すテクスチャ 1024x16 があります。基本的に持っているのはストリップだけです。実際の向きなどの考慮事項はさておき、レンダリングする必要があります。

たとえば、ビューポートが 300x400 で、画面上に 200px のテクスチャが必要です (より興味深いものにするため)。位置 (1024-200) = 824 に到達するまで、単一の領域で完全にレンダリングできます。この位置に到達すると、明らかにテクスチャがなくなります。でも羅針盤なので、最後まで来たらまた始めなければならないのは明らかです。これが答えです。別のテクスチャ領域でうまくいきます。825 ~ 1023 の範囲は、別の領域で表す必要があります。2 番目の領域のサイズは、すべての値 pos>824 && pos<1024 に対して (1024-pos) になります。

このコードは、コンパスの実際の例として機能することを意図しています。範囲 (0-3.6) から (0-1024) への変換により、常に相対位置で動作するため、非常に汚れています。

spriteBatch.begin();
    if (compassorientation<0)
        compassorientation = (float) (3.6 - compassorientation%3.6);
    else
        compassorientation = (float) (compassorientation %  3.6);
    if ( compassorientation < ((float)(1024-200)/1024*3.6)){
        compass1.setRegion((int)(compassorientation/3.6*1024), 0, 200, 16);
        spriteBatch.draw(compass1, 0, (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), Gdx.graphics.getWidth(), 32 * (float)1.2);

    }
    else if (compassorientation > ((float)(1024-200)/1024*3.6)) {
        compass1.setRegion((int)(compassorientation/3.6*1024), 0, 1024 - (int)(compassorientation/3.6*1024), 16);
        spriteBatch.draw(compass1, 0, (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), compass1.getRegionWidth()/200f * Gdx.graphics.getWidth() , 32 * (float)1.2);
        compass2.setRegion(0, 0, 200 - compass1.getRegionWidth(), 16);
        spriteBatch.draw(compass2, compass1.getRegionWidth()/200f * Gdx.graphics.getWidth() , (Gdx.graphics.getHeight()/2) -(-250 + compass1.getTexture().getHeight()* (float)1.2), Gdx.graphics.getWidth() - (compass1.getRegionWidth()/200f * Gdx.graphics.getWidth())  , 32 * (float)1.2);
    } 


    spriteBatch.end();
于 2012-01-24T18:16:43.463 に答える
1

以下のように setWrap 関数を使用できます。

Texture texture = new Texture(Gdx.files.internal("images/background.png"));
texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);

背景を繰り返し描いていきます!この助けを願っています!

于 2012-11-02T05:41:51.240 に答える
1

オブジェクトのテクスチャを初期化する場所の下。次に、このタイプの下に

YourTexture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);

YourTexture は、パララックス スクロールするテクスチャです。

このコードのレンダリング ファイルの種類で。

batch.draw(YourTexture,0, 0, 0 , srcy, Gdx.graphics.getWidth(),     
           Gdx.graphics.getHeight());  
srcy +=10;

エラーになるので、srcyという変数を作ってください。それはあまりにも空想的ではありません。

Int srcy
于 2014-06-27T01:47:20.193 に答える