Gerakan halus dalam game berbasis ubin

8

Bagaimana kita bisa membuat karakter kita bergerak dengan lancar melintasi ubin? Dia bergerak ubin demi ubin, tapi itu terlihat tidak profesional. Selain itu, saat Anda menahan tombol panah, ia membuka layar. Bagaimana kita dapat mencegah hal itu terjadi?

leo882
sumber
Anda menggunakan bilangan bulat untuk pergerakan pemain. Coba gunakan pelampung sebagai gantinya.
Mokosha
1
Yang terbaik adalah jika Anda mengurangi kode Anda ke minimum yang diperlukan untuk menunjukkan / mengomunikasikan masalah / pertanyaan Anda. Anda juga mungkin tertarik dengan pertanyaan ini .
kevintodisco
1
Saya menghapus bagian yang tidak perlu dari pertanyaan Anda. Yang terbaik adalah langsung ke intinya dan tidak menambahkan kode tambahan atau fluff lainnya.
MichaelHouse

Jawaban:

6

Gerakan halus dapat dicapai dengan beberapa cara. Dan itu benar-benar tergantung pada jenis gerakan apa yang ingin Anda izinkan.

  • Gerakan masih terbatas pada ubin. Jenis ini adalah yang paling mudah untuk melakukan hal-hal seperti deteksi tabrakan dan pemeriksaan gerakan lainnya. Untuk jenis gerakan ini, Anda hanya akan menginterpolasi posisi dari waktu ke waktu saat transisi di antara ubin. Ini bisa sesederhana menambahkan sesuatu seperti yang berikut ke loop pembaruan.

Kode palsu:

 if(GetDistance(position, targetposition) > minDistance) {
     position = MoveTowards(position, targetposition, deltatime);
 }

Di mana MoveTowardshanya mengambil posisi saat ini dan menambahkan sebagian jarak antara itu dan posisi target.

  • Gerakan tidak terbatas pada ubin. Ini menjadi jauh lebih sulit untuk diterapkan. Intinya dengan metode ini Anda hanya menyimpan posisi dan memperbaruinya melalui kecepatan. Artinya, perubahan posisi seiring waktu.

Menahan tombol panah untuk memindahkan karakter juga dapat diimplementasikan dalam beberapa cara berbeda. Kemungkinan yang Anda lakukan adalah sesuatu seperti:

if(keydown(left))
   tilePosition.X--;

Ini memang akan menyebabkan karakter untuk zip di layar. Karena Anda akan memperbarui posisi berkali-kali per detik. Cara yang sedikit lebih baik untuk mengimplementasikan ini adalah dengan menambahkan penundaan. Sesuatu seperti

if(keydown(left)) {
    if(leftKeyHeldTimer > movementDelay) {
        tilePosition.X--;
        leftKeyHeldTimer = 0;
    } else {
        leftKeyHeldTimer+= deltaTime;
    }
}

Ini akan menambah waktu tunda dan hanya memperbarui posisi ubin ketika movementDelaynilai telah terpenuhi.

MichaelHouse
sumber
0

Saya dapat mengidentifikasi dua masalah. Yang pertama terkait dengan gerakan halus dan yang kedua terkait dengan karakter zip dari layar.

Untuk membuat gerakan halus, Anda dapat menggunakan teknik yang disebut Linear Interpolasi atau (LERP) untuk memuluskan gerakan. Pada dasarnya cara kerjanya adalah antara titik awal dan titik akhir Anda menghitung satu set jarak yang semakin kecil untuk meniru gerakan halus dan melambat ketika titik akhir hampir tercapai.

Contoh paling sederhana dari fungsi ini adalah:

//point1 is the current position, will be starting position on first call
//point2 is the target position
//epsilon is the % of the distance between current and target you want
//to cover per game physics loop (a fixed realworld time based loop).
//The smaller the % the "smoother" the motion.

float lerp(float point1, float point2, float epsilon)
{
    return point1 + epsilon * (point2 - point1);
}

Saat karakter bergerak lebih dekat ke titik 2 secara bertahap akan melambat. Catatan meskipun mereka tidak akan pernah benar-benar menyentuh titik 2 tetapi mendekati tanpa batas. Anda harus memperbaiki ini dan jika pemain kurang dari jarak yang sangat kecil dari titik 2, kami dapat mempertimbangkan pemain berada di titik 2.

Masalah kedua yang Anda sebutkan terkait dengan karakter Anda terbang di layar. Ini adalah hasil dari input yang dibaca setiap penyegaran loop game yang dikombinasikan dengan gerakan instan antar ubin.

Idealnya untuk menyelesaikan ini, dalam kode Anda, Anda perlu memutuskan

  1. Berapa banyak waktu di dunia nyata yang diperlukan karakter untuk berpindah dari titik 1 ke titik 2.
  2. Atur Lerp Anda untuk menjalankan antara titik 1 dan dua selama durasi ini
  3. Baca input lagi setelah titik 2 telah tercapai untuk memutuskan ke mana harus pergi
Ang Li
sumber