スプライトを向いている方向に移動するにはどうすればよいですか?


11

Java / Slick 2Dを使用しています。マウスを使用してスプライトを回転させ、矢印キーを使用してスプライトを移動しようとしています。スプライトを回転させることは問題ありませんが、本来の方向に動かすことができません。「進む」を押すと、スプライトが必ずしもマウスの方向に移動するわけではありません。実際には、画面の左側に移動するだけです。多くのゲームがこのスタイルのモーションを使用するので、これにはいくつかの標準コードが必要だと確信しています。誰かがトリガーが何であるかを教えてくれますか?ありがとう

編集:これは回転コードです(これは何か奇妙なことをします:https//stackoverflow.com/questions/12610320/why-is-my-image-rotating-off-center

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng); 

そして、移動コード。画面の左側にしか移動できません...

double ang = sprite.angle;
            Input input = gc.getInput();

            if(input.isKeyDown(sprite.up)){
                sprite.x += Math.cos(ang)*sprite.moveSpeed;
                sprite.y += Math.sin(ang)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.down)){
                sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.left)){
                sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.right)){
                sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }

追加したコードのポイントは何ですか?これは新しい問題ですか?新しい問題の場合は、新しい質問を開いてください。この質問は、スプライトを向いている方向に移動することに関する情報でのみ更新してください。
MichaelHouse

いいえ、問題を引き起こしたのは私が使用したコードです。以下のコメントを参照してください。誰かがそれを求めました。
rphello101 2012

sprite.movespeedを計算する場所がわかりませんか?
AturSams 2012

movespeedは定数で、この場合は.3に設定されています
rphello101

回答:


14

現在の速度と進行方向に基づいてベクトルを取得する必要があります。次に、そのベクトルを使用して位置を増分します。

//first get the direction the entity is pointed
direction.x = (float) Math.cos(Math.toRadians(rotation));
direction.y = (float) Math.sin(Math.toRadians(rotation));
if (direction.length() > 0) {
    direction = direction.normalise();
}
//Then scale it by the current speed to get the velocity
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;

これで、回転に基づく速度がわかりました。あなたはその情報であなたの位置を更新することができます。

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;

:このすべてが含まれています(ずさん)クラスの場合、あなたはLudumは、私がここに一緒に入れて21エントリあえて見ることができますbitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/...
MichaelHouse

ありがとうございました。いくつかの変更後、これは機能しました。あなたがたまたまこれを読んだ場合、私はあなたに別の質問をします:スプライトを後ろに動かすことはあなたがここに持っているもののちょうど=です。どうすれば左または右に移動できますか?
rphello101 2012年

@ rphello101良い質問です。新しい質問をする必要があります。より多くの人々が恩恵を受け、あなたは私が持っているよりも良い答えを得るかもしれません。
MichaelHouse

3

マウスの位置がわかります

mouseX = ... 
mouseY = ...

スプライトの位置を取得します

spriteX = ...
spriteY = ...

あなたは角度を見つける

angle = Math.atan2(mouseY - spriteY, mouseX - spriteX);

あなたの動きは:

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;

ヒントとして:cosとsinのテーブル(配列)を事前に計算された値で作成します。つまり、cosTable [(int)angle] *速度*時間とsinTable [(int)角度] *速度*時間を実行するだけです。しかし、あなたはあなたの価値をより速く得ることができます。
Sidar 2012

これにより、スプライトがマウスの方向に移動しますが、スプライトが向いている方向とは異なります。スプライトは、回転速度が制限されているか、その他の理由で、まだマウスの方を向いている可能性があります。基本的に、あなたは間違った質問に答えています。
MichaelHouse

@ Byte56彼は「私が「進む」を打ったとき、スプライトは必ずしもマウスの方に動くとは限らない」と言ったと私は彼が尋ねたものだと思います。あなたは正しいかもしれません。
AturSams 2012

それは確かに少しあいまいです。この場合、デフォルトで質問のタイトルを設定しました。誤解しないでください。あなたの答えはいいです。OPが何を求めていたのか、いつ戻ってきたのかがわかると思います。
MichaelHouse

2
@Sidarそれは時期尚早の最適化でしょう。sin / cos操作をボトルネックとして特定せずにsin / cosテーブルを作成することは、時間の無駄です。
bummzack 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.