2012-04-18 18 views
1

私は主に自分を教えるために簡単なゲームライブラリを作成しようとしています。私はこことウェブでいくつかの記事を読む。しかし、私は自分自身の論理を使っているので、私の問題は少し違っていると思う。Javaゲーム、バウンス&ムーブメント

基本:画面上

私のすべてのオブジェクトは、「実体」と呼ばれ、彼らは「EntityActionListener」ウィッヒと呼ばれるインターフェースを実装することができるされている上に移動し、マウスでキーボードを操作することができます画面など

エンティティを移動するにはどうすればよいですか?

アイデア:私は動きを実装するすべての

まず、その後、バウンスして、エンティティの衝突。

運動のために

とバウンス、と私は問題を抱えているところです、私は、次の変数と関数をしたい:

protected float posx = 0, posy = 0; 
protected float v = 0, vx = 0, vy = 0; 
protected int direction = 0; 

私はarg1がして更新する(v)の速度を設定するsetVelocity(float arg1)機能を使用軸上の速度(VX、VY):

/** 
* Set the velocity on both axis according to the direction given 
* 
* @param arg1 the direction in degrees 
* @param arg2 the velocity 
*/ 
private void setVelocityOnAxis(int arg1, float arg2) 
{ 
    // Check for speed set to 0 
    if (arg2 == 0) { 
     vx = 0; 
     vy = 0; 
     return; 
    } 

    // Set velocity on axis 
    vx = (float) (Math.cos(arg1 * Math.PI/180) * arg2); 
    vy = (float) (Math.sin(arg1 * Math.PI/180) * arg2); 
} 

だから速度(V)は、例えばトリガイベント内で更新することができます。 =>この手順はうまくいくようです。

しかし、私は次のように扱われるべき方向といくつかのトラブルを抱えている:

/** 
* Set the entity direction 
* 
* @param arg1 the direction in degrees 
*/ 
protected final void setDir(int arg1) 
{ 
    // Update direction 
    direction = arg1; 

    // Update velocity on axis 
    setVelocityOnAxis(direction, v); 
} 

/** 
* Get the enity direction based on the axis 
* 
* @param arg1 the x velocity 
* @param arg2 the y velocity 
*/ 
protected final int getPointDir(float arg1, float arg2) 
{ 
    // Set the direction based on the axis 
    return (int) (360 - Math.abs(Math.toDegrees(Math.atan2(arg1, arg2)) % 360)); 
} 

私は比較することにより、4つの方向をチェックして、私は、フレームの境界にバウンスを持っていると思いましたxとyの座標を計算し、辺に応じてvxまたはvyのいずれかをその加法的逆数(1から-1など)に設定します。しかし、これは失敗します。

私はちょうど両側のvxまたはvyを更新すれば、期待どおりにバウンスしますが、方向はこの理由で更新されません。ここで

は、私が使用するコードです:

// ... 
// Hit bounds on x axis 
direction = -vx; // works. 
setDir(getPointDir(-vx, vy)); // does not work. 

私は幾何学と三角法では良いことではありませんよ。問題は、360度方向に1の水平速度で衝突すると、45度やデバッグプリントから得られる奇妙なことが起こる理由は言えません。

本当に誰かが助けてくれることを願っています私。私はただそれを修正することはできません。

EDIT:

私の質問は:なぜこれが動作していません。 setDir()またはgetPointDir()のコードの一部が間違っていなければなりません。

EDIT 2

だから、私は最終的にそれが動作します。問題はエンティティが45の方向を持ち、下向きではなく下向きに移動したので、vの速度に対して逆の逆数になります。これはマイナスとマイナスが正であり、バウンスしている間に両方の速度が常に変化するため、とvy。代わりに度の計算で何かを変更しなければなりませんでした。ご協力ありがとうございました。

+0

具体的な質問はここでは解決できません。それがちょうど三角法の場合は、Stack Overflowがおそらく最適な場所ではないでしょう... –

+0

コードが行うべきことを本当に混乱させます。あなたの引数にarg1とarg2よりも意味のある名前を付けることもできます。 :) – Torious

+0

各機能には多くのコメントがあります。まあ、名前を変えることはできますが、これはどうにも関係しません。 –

答えて

1

getPointDir()setVelocity()は、x、y、x、yの度数をそれぞれ度単位で計算する必要があります。その場合は、ここでgetPointDirの適切な行)が(だ:

return (int) (360 + Math.toDegrees(Math.atan2(arg2, arg1))) % 360; 

簡単なテスト:エラーのよう

public static void main(String[] args) { 
    Test t = new Test(); 

    for (int i = 0; i < 360; i++) { 
     t.setVelocityOnAxis(i, 10); 
     System.out.println("Angle: " + i + " vx: " + t.vx + " vy: " + t.vy); 
     System.out.println("getPointDir: " + t.getPointDir(t.vx, t.vy)); 
    } 

} 

編集atan2()は常にy,xです - 変数を見つけることが容易にarg1、arg2以外の名前他のエラーはMath.absロジックにありました。

+0

あなたが書いたようにatan2()でエラーが見つかりました。これに似たものを書きました。デバッグのプリントは正しいものでした。しかし、バウンスはまだ変わっています(正しく動作していない)ときどきバウンスしないでください。それが縁に達してから跳ね返るまで。私は上記のポストを更新しました - 一見してください。 –

0

チェックthis answer。それは正しく軸にバウンスしています。入ってくる角度は、ちょうど反対の、出てくる角度と同じくらい大きいと考える必要があります。ポストの写真はこれを説明しています。がんばろう。

+0

これは私が実装したいことだけです。しかし、問題はそれをどうやって行うのかではありません。問題は、なぜそれが機能していないのか分からないことです。 –

0

おそらくこれはあなたが探しているものですgetPointDir()

double deg = Math.toDegrees(Math.atan2(arg1, arg2)); 
if (deg < 0) deg += 360; 
return (int) deg; 

そして、あなたのオリジナルのポストにようsetDir(getPointDir(-vx, vy))を使用しています。