1

私は主に自分自身を教えるために簡単なゲームライブラリを作成しようとしています。私はこことウェブのいくつかの投稿をそのように読んだ。しかし、私は自分の「独自のロジック」を使用しているため、問題は少し異なると思います。

基礎:

画面上のすべてのオブジェクトは「エンティティ」と呼ばれ、「EntityActionListener」と呼ばれるインターフェイスを実装できます。このインターフェイスを使用すると、マウスやキーボードを操作したり、画面上を移動したりできます。

エンティティを最良の方法で移動する方法は?

アイディア:

まず、ムーブメントを実装し、次にバウンス、次にエンティティの衝突を実装します。

動きと跳ね返りについて、そしてこれが私が問題を抱えているところです、私は次の変数と関数が欲しいです:

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

この関数を使用してsetVelocity(float arg1)、速度(v)を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));
}

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

両側のvxまたはvyを更新すると、予想どおりにバウンスしますが、このため方向は更新されません。

これが私が使用したコードです:

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

私は幾何学と三角法があまり得意ではありません。問題は、水平方向の速度が1で360方向に衝突すると、デバッグプリントから得た45度またはその他の奇妙な結果になる理由がわからないことです...

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

編集:

私の質問は、なぜこれが機能しないのかということです。setDir()またはgetPointDir()の一部のコードが間違っている必要があります。

編集2

だから、私はついにそれを機能させることができます。問題は、エンティティの方向が45で、上向きではなく下向きに移動したため、v速度の逆数を加算することでした。これにより、マイナスとマイナスが正であり、バウンスしている間、常に両方の速度、vxが変化するため、この愚かなエラーが発生します。とvy。代わりに、度の計算で何かを変更する必要がありました。ご協力ありがとうございました。

4

3 に答える 3

1

私は、x、yから度単位の方向を計算し、度単位の方向からx、yを(それぞれ)計算する必要があるgetPointDir()と推測しています。setVelocity()その場合、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以外の変数名を使用すると、見つけやすくなります。もう 1 つのエラーは、Math.abs ロジックにありました。

于 2012-04-19T03:41:29.577 に答える
0

多分これはあなたが探しているものです...(まだコードを取得できるかどうかわかりません)。

getPointDir()

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

そしてsetDir(getPointDir(-vx, vy))、元の投稿で like を使用します。

于 2012-04-19T01:15:55.310 に答える
0

この回答を確認してください。正しく軸上で弾む。入ってくる角度は出ていく角度と同じくらい大きく、ちょうど反対であると考えなければなりません。投稿の写真はこれを説明しています。幸運を。

于 2012-04-19T00:07:32.907 に答える