2016-08-09 16 views
0

私はJavaとAndroidを初めて使いました。私は最近、LibGDXを使ってAndroid用のゲームを作成しようとしています。このゲームの1つの側面は、画面の一方の側から他方の側へ(水平方向に)移動する人を含む。これは私のコードです: `インスタント速度の変更LibGDX

public class Man { 
    private static final int SP = 10; 
    private static final int NSP = -10; 
    private Vector3 position; 
    private Vector3 velocity; 
    private Texture man; 

    public Man(int x, int y){ 
     position = new Vector3(x, y, 0); 
     velocity = new Vector3(0, 0, 0); 
     man = new Texture ("person.png"); 

    } 

    public void update(float dt){ 
     if (position.x > 2560) { 
      velocity.add(NSP, 0, 0); 
     } 
     else { 
      velocity.add(SP, 0, 0); 
     } 
     velocity.add(SP, 0, 0); 
     velocity.scl(dt); 
     position.add(velocity.x, 0, 0); 
     velocity.scl(1/dt); 
    } 

    public Texture getTexture() { 
     return man; 
    } 

    public Vector3 getPosition() { 
     return position; 
    } 

    public void dispose(){ 
     man.dispose(); 
    } 

} 

私はまだこのような問題を理解するのに慣れていません。このコードを実行すると、画面の片側(左)から画面の反対側(右端、非表示)に移動します。人は2〜2秒後に(右側から)視界に戻り、画面の反対側に行く(左側に、視界に留まる)。このプロセスが繰り返されます。また、人が移動を開始したときには、フルスピードになるまでには秒を要します。私はif else文を削除し、異なる速度(正と負)の2人を作成して、人が速度を瞬時に変えるという錯覚を作り出しましたが(1人を削除して別の人を産むことによって)、これを行うことができます。

私は、スピードを即座にフルスピードにし、画面の反対側で瞬時に速度を変更し、ループでこのプロセスを続行する方法を知りたいと思います。どんな助けでも大歓迎です。おかげさまで

答えて

1

コードを歩き、論理について考えてみましょう。

速度に常にSPを追加してif-elseステートメントに従います。だから、効果的に、あなたはこの等価で、その結果、あなたのif-elseとその数学を組み合わせることができます。

単に
if (position.x > 2560) { 
     velocity.add(0, 0, 0); 
    } 
    else { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

以上:

if (position.x <= 2560) { 
     velocity.add(2 * SP, 0, 0); 
    } 
    velocity.scl(dt); 
    position.add(velocity.x, 0, 0); 
    velocity.scl(1/dt); 

だから、あなたは常にすべてのフレームに2 * SPによって加速され、あなたが画面を離れていない限り、あなたの速度は上がりませんが、あなたはまだ画面から右にズームしています。

速度を瞬時に変更したい場合は、速度を特定の値に設定し、何かを追加する必要はありません。また、ベクトルのスケーリングやスケーリングを行わないことをお勧めします。これは、丸め誤差の導入を開始する可能性があるためです。ここでは、画面の左右からピンポンにあなたのキャラクターを取得する方法です。

public void update(float dt){ 
    if (velocity.x == 0) 
     velocity.x = SP; //first frame setup 

    //only change the velocity if character is off screen, otherwise leave it alone 
    if (position.x > 2560) 
     velocity.x = NSP; 
    else if (position.x < 0 - texture.getWidth()) 
     velocity.x = SP; 

    position.add(velocity.x * dt, 0, 0); 
} 

注、私はあなたの文字の幅があるものは何でものためのプレースホルダとしてtexture.getWidth()を使用。実際には、プレーヤークラスの内部にテクスチャなどのアセットをロードするのは悪い習慣です。アセットをゲームのロジックと混同しています。これは、バグが発生しやすく、保守が難しいコードのレシピです。すべての資産をロードして保存するには、資産マネージャークラスを使用することをお勧めします。あなたのキャラクターのドローメソッドは、アセットマネージャをパラメータとして取り、そのアセットリファレンスをそこから選択することができます。例:

public void draw (SpriteBatch batch, MyAssets assets){ 
    TextureRegion region = assets.getRegion("man"); //imaginary assets class--implementation up to you 
    batch.draw(region, x, y); 
} 
+0

ありがとうございます!!!!!! –

関連する問題