Bagaimana saya bisa memindahkan sprite ke arah yang dihadapinya?

11

Saya menggunakan Java / Slick 2D. Saya mencoba menggunakan mouse untuk memutar sprite dan tombol panah untuk memindahkan sprite. Saya bisa membuat sprite berputar tanpa masalah, tapi saya tidak bisa membuatnya bergerak ke arah yang seharusnya. Ketika saya menekan "maju", sprite tidak selalu bergerak ke arah mouse. Sebenarnya, itu hanya akan bergerak ke kiri layar kok. Saya yakin harus ada beberapa kode standar untuk ini karena banyak permainan menggunakan gaya gerak ini. Adakah yang bisa membantu saya dengan apa yang seharusnya menjadi trigonometri? Terima kasih

EDIT: Ini adalah kode rotasi (yang melakukan sesuatu yang aneh: /programming/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); 

Dan kode pergerakannya. Saya hanya bisa bergerak ke kiri layar ...

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;
            }
rphello101
sumber
Apa gunanya kode yang Anda tambahkan? Apakah ini masalah baru? Jika ini masalah baru, harap buka pertanyaan baru. Harap perbarui pertanyaan ini hanya dengan informasi terkait memindahkan sprite ke arah yang dihadapinya.
MichaelHouse
Tidak, itu kode yang saya gunakan yang menyebabkan masalah. Lihat komentar di bawah. Seseorang memintanya.
rphello101
Saya tidak melihat di mana Anda menghitung sprite.movespeed?
AturSams
movepeed adalah konstanta, dalam hal ini ditetapkan pada 0,3
rphello101

Jawaban:

14

Anda ingin mendapatkan vektor berdasarkan kecepatan dan tajuk Anda saat ini. Kemudian gunakan vektor itu untuk meningkatkan posisi Anda.

//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;

Jadi sekarang Anda tahu kecepatan Anda berdasarkan rotasi Anda. Anda dapat memperbarui posisi Anda dengan informasi itu.

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;
MichaelHouse
sumber
Untuk kelas (ceroboh) yang berisi semua ini, Anda dapat melihat entri Ludum Dare 21 yang saya kumpulkan di sini: bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/…
MichaelHouse
Terima kasih. Setelah beberapa modifikasi, ini berhasil. Saya punya pertanyaan lain untuk Anda jika Anda kebetulan membaca ini: membuat sprite untuk bergerak mundur hanyalah - = dari apa yang Anda miliki di sini. Bagaimana cara membuatnya bergerak ke kiri atau kanan?
rphello101
@ rphello101 Pertanyaan bagus, Anda harus mengajukan pertanyaan baru. Lebih banyak orang akan mendapat manfaat dan Anda mungkin mendapatkan jawaban yang lebih baik daripada yang saya miliki.
MichaelHouse
3

Anda mendapatkan posisi mouse

mouseX = ... 
mouseY = ...

Anda mendapatkan posisi sprite

spriteX = ...
spriteY = ...

Anda menemukan sudutnya

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

Gerakan Anda akan:

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;
AturSams
sumber
Sebagai tip: Buat tabel (array) untuk cos dan sin dengan nilai yang sudah dihitung sebelumnya. jadi kamu bisa melakukan cosTable [(int) angle] * speed * time dan sinTable [(int) angle] * speed * time Ini tidak seakurat itu. Tetapi Anda mendapatkan nilai-nilai Anda lebih cepat.
Sidar
Ini akan memindahkan sprite ke arah mouse, tetapi itu tidak sama dengan arah sprite menghadap. Sprite masih bisa berputar untuk menghadap mouse jika kecepatan rotasi dibatasi atau alasan lain. Pada dasarnya, Anda menjawab pertanyaan yang salah.
MichaelHouse
@ Byte56 dia berkata "Ketika saya menekan" ke depan ", sprite tidak selalu bergerak ke arah mouse" Saya pikir itu yang dia tanyakan. Anda bisa saja benar.
AturSams
Agak ambigu pasti. Saya baru saja gagal untuk judul pertanyaan dalam kasus ini. Jangan salah paham, jawaban Anda bagus. Saya kira kita akan mengetahui apa yang diinginkan OP ketika / jika mereka kembali.
MichaelHouse
2
@ Sidar Itu akan menjadi optimasi prematur. Membangun tabel dosa / cos tanpa mengidentifikasi operasi dosa / cos sebagai hambatan adalah buang-buang waktu.
bummzack