5

数日前、LibGdx でスクロールする方法を見つけました。今、私は関連することをしようとしています。背景を繰り返したい。私のスクロールは船を追いかけます(エースシップゲームです)。背景には、テクスチャとして読み込まれた宇宙の写真があります。船がバックゴーランドの端に到達すると、船は進み続け、もう背景はありません。ラップについて読んだことがありますが、それがどのように機能するのかよくわかりません。私はそれをしました:

    px=new Pixmap(Gdx.files.internal("fondo.jpg"));
    background=new Texture(px);
    background.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);

そして、私の render メソッドで

spriteBatch.begin();
    spriteBatch.draw(background,0,0,500,50);
    drawShip();
spriteBatch.end();

もちろん、それは機能しません。背景を一度だけ描画します。このラップ メソッドを機能させる方法がわかりません。何か助けはありますか?

解決

私はそれを考え出した。素敵なコードではありませんが、機能します。

まず、同じ画像で 2 つのテクスチャを宣言します

 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));

また、このように 2 つの変数を宣言して、各 bck の位置の X 値を指定します

 int posXBck1=0,posXBck2=0;

次に、それを Render() で使用します

 public void calculoPosicionFondos(){
    posXBck2=posXBck1+ANCHODEFONDO;
    if(cam.position.x>=posXBck2+cam.viewportWidth/2){
        posXBck1=posXBck2;
    }
}

どこ:

ANCHODEFONDOは私の背景の幅です

カムは OtrhoCam です。

つまり、カムが bck2 にある場合 (これは、bck1 がもう見えないことを意味します)、位置を変更し、bck1 に bck2 の位置を与え、次のレンダリング ループで bck2 を再計算します。

次に、レンダリング モードで両方のバックをペイントします。

4

4 に答える 4

22

Teitus が言ったように、テクスチャを複数回ロードしないでください。とにかく、あなたはラッパーで正しい軌道に乗っています:

texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);

これで、ソースの場所で draw メソッドを使用できます。ソースの場所は、テクスチャ上に描画するために選択した領域です。

batch.draw(texture, x, y, srcX, srcY, srcWidth, srcHeight)

テクスチャを右から左にスクロールするには、srcX を段階的に増やすだけです。そのため、update/render メソッドでインクリメントする int を作成します。

int sourceX = 0;

//render() method

//Increment the variable where to draw from on the image.
sourceX += 10;

//Simply draw it using that variable in the srcX.    
batch.draw(YourTexture, 0, 0, sourceX, 0, screenWidth, screenHeight);

テクスチャをラップしているため、無限にラップ/ループしてスクロールします。int は 2147483647 しか保持できないため、ゲームが非常に長時間実行される場合、sourceX int に問題がある可能性があります。しばらく時間がかかりますが、数値が画像の合計幅を超えるたびに画像の幅を減算することで修正できます。 .

于 2014-05-18T13:37:38.743 に答える
10

これをしないでください:

bck1=new Texture(Gdx.files.internal("fondo.jpg"));
bck2=new Texture(Gdx.files.internal("fondo.jpg"));

これにより、大きな背景テクスチャが 2 回読み込まれます。それは完全な無駄です。少なくともソリューションを維持したい場合は、次のようにします。

bck1=new Texture(Gdx.files.internal("fondo.jpg"));
bck2=bkg1;

ラッピングについて テクスチャの幅が 500px で、500px のスプライトを描画すると、繰り返しは表示されません。2 回繰り返したい場合は、0 ~ 2 のテクスチャ座標で幅 1000 ピクセルで描画します。あなたが投稿した呼び出しを spriteBatch がどのように処理するかはわかりません。それを試すか、テクスチャ領域を使用して領域を手動で設定するオーバーロードを使用することができます。

于 2013-01-31T13:33:24.927 に答える
-1

解決

私はそれを考え出した。素敵なコードではありませんが、機能します。

まず、同じ画像で 2 つのテクスチャを宣言します

 bck1=new Texture(Gdx.files.internal("fondo.jpg"));
 bck2=new Texture(Gdx.files.internal("fondo.jpg"));

また、このように 2 つの変数を宣言して、各 bck の位置の X 値を指定します

 int posXBck1=0,posXBck2=0;

次に、それを Render() で使用します

 public void calculoPosicionFondos(){
    posXBck2=posXBck1+ANCHODEFONDO;
    if(cam.position.x>=posXBck2+cam.viewportWidth/2){
        posXBck1=posXBck2;
    }
}

どこ:

ANCHODEFONDOは私の背景の幅です

カムは OtrhoCam です。

つまり、カムが bck2 にある場合 (これは、bck1 がもう見えないことを意味します)、位置を変更し、bck1 に bck2 の位置を与え、次のレンダリング ループで bck2 を再計算します。

次に、 render() で両方のバックを描画するだけです

于 2013-01-30T18:01:17.773 に答える