2017-04-03 11 views
0

私は、X軸上を前後に移動する複数のオブジェクトを保持する矩形配列を持っています。 Libgdx:オブジェクトを重ならないでX軸上で移動するには?

Iterator<Rectangle> iter = array.iterator(); 

while (iter.hasNext()) { 
    Rectangle obj = iter.next(); 
    array.get(i).x += speed * Gdx.graphics.getDeltaTime() ; 

    if (obj.x + obj.width > 800 || obj.x < 0) { 
     speed = -speed; 
    } 
} 

速度が大きくなっ

は、あなたが他のオブジェクトと重なって、配列内の最初のオブジェクトに気付いし、それらを離れて押し始めます。それを修正するには?

は、基本的に、各オブジェクトは、

Rectangle obj = new Rectangle(); 
obj.x = xpos; 
obj.y = ypos; 
obj.width = width; 
obj.height = height; 
xpos += width + 4; 

を有し、テクスチャ、画像、sqaure、rectange、三角形...を有し、各オブジェクトは、他とは異なるX位置xposで生成されます。彼らがするのは、x = 0から800までのX軸上を移動し続けます。

最初のオブジェクトが0になると、再び速度を上げて他のオブジェクトと重なり合い、時間が経つにつれてすべてのオブジェクトが重なり合って離れます。オブジェクト間の距離をどんな速度でも一定に保ちたい。

+0

コードスニペットは理解しにくいので、質問テキストもあります。あなたが達成しようとしていることを明確にして、コードの重要な部分を投稿して、何が何であるかを推測する必要はありません。 –

+0

@ p.streef better better? – Lynob

+0

実際にはありません。まず、 "array"という名前をもう一度再利用するため、コードサンプルはコンパイルされません。あなたが使用するすべてのオブジェクトが何であるかを私たちが知っているように話します。私たちはまだ推測する必要があります。四角形とは何ですか?配列の内部には何がありますか? objとは何ですか? sidenoteとして。これはiOSやアンドロイドとは関係がないので、それらのタグは属していません。 –

答えて

1

あなたがコメントしたことから、質問は「どのようにこれらのブロックをすべて一緒に動かすことができ、あるエッジから別のエッジにバウンスするか」というように見えます。問題はあなたがバウンスしているということですが、グループとしての行動はやめてしまいます。


あなたがそれらをグループとして扱いたい場合はまず、 - 最も簡単な方法は、小さい(取るに足らない)オブジェクトの多くを含む一つの大きなバウンディングボックスとしてそれらを考慮することです。単一のオブジェクトとして左右に移動すると、必要な動作が得られます。

さておき、あなたの質問に直接答えは 「あなたはイテレーションを経て、方向途中で変更している」され

。したがって、1つのティックでは、いくつかのオブジェクトが左に移動し、一部が右に移動しました。つまり、グループとしての動作を停止します。あなたはそれを整理する方法

はあなた次第ですが、これはあなたが必要とする基本的な考え方である。重要なのは、すべてが、同じ方向に、同じ量ですべてのフレームを移動する必要があります

// assume "speedForThisFrame" is a float defined outside this function 
float speedForNextFrame = speedForThisFrame 
// iterate through however you want 
Iterator<Rectangle> iter = array.iterator(); 
while (iter.hasNext()) { 
    Rectangle obj = iter.next(); 
    obj.x += speedForThisFrame * Gdx.graphics.getDeltaTime() ; 

    // if it's moved out of bounds, we will change direction NEXT fame 
    if (obj.x + obj.width > 800 || obj.x < 0) { 
     speedForNextFrame = -speedForThisFrame; 
    } 
} 
// now that all movement has finished, we update the speed 
speedForThisFrame = speedForNextFrame 

。更新中の速度を変更すると、それらが独立して動作するようになります。

グループが境界よりも大きい場合、または1つのフレーム内の境界を超えて次のフレームを完全に取り戻すことができない場合でも、問題は発生します。これらは別々の問題ですが、別の質問で尋ねることができます。

1

あなたの問題は、Gdx.graphics.getDeltaTime()のバリエーションによって、長方形が0/800の境界を異なる距離で超えていることです。

例: 第1工程:

Rect #1 x=790 
Rect #2 x=780 
Speed=100, DeltaTime=0.11 => DeltaX=11 

このステップの後、のRect#1は791で、801でのRect#2であろう、その距離は10です。

次のステップ:

DeltaTime=0.12 => DeltaX=12 

このステップの後、のRect#1は、789で803でのRect#2で、彼らの距離は、異なる距離を移動するので、14

あなたの長方形は自分の距離を変化です。考えられる解決策は、実際に国境で跳ね返ることです。したがって、速度を逆転するだけでなく、長方形を境界線を超えて反対方向に移動させる必要があります。

従ってRect#1は790で右に11ピクセル移動すると801にならないはずですステップの最後では799(右に10ピクセル移動し、左に1ピクセル移動)になります。

+0

を返すものです。質問された質問に対する回答ではありませんが、これは別の問題の解決策です。境界線を越えて「つまらない」または急に動く)。 – Bilkokuya

+0

はい、これは大いに役立ちますが、私は提案されたソリューションを実装する方法を知らない – Lynob

関連する問題