Metode yang efektif untuk terus memperbarui pergerakan dalam game menara pertahanan?


8

Kami adalah empat orang yang membuat game Tower Defense sebagai proyek di kelas satu di universitas. Game ini akan menjadi sangat sederhana!

  • Tiga menara berbeda
  • Tiga monster berbeda
  • Satu peta (mungkin tambahkan lagi jika kita punya waktu)

Permainan harus berorientasi objek.

Struktur kelas adalah sebagai berikut

  • Game - Menggambar grafik, dll.
  • Level - Setiap level adalah objek dari kelas ini. Setiap level memiliki jumlah objek gelombang yang terbatas (dalam daftar)
  • Wave - Berisi daftar objek monster.
  • Monster - Ini adalah superclass. Kami membuat subclass untuk berbagai jenis monster
  • Tower - Superclass ke menara. Ada subkelas untuk setiap jenis menara.

Kami berpikir tentang bagaimana menyelesaikan masalah yang harus dilakukan banyak objek, pada saat yang sama, misalnya memindahkan satu piksel dalam satu arah.

Apa yang kami temukan adalah ide mengimplementasikan Timer kelas av, untuk mengontrol kapan objek melakukan sesuatu. Saya tidak yakin ini adalah cara terbaik untuk melakukannya. Bisakah seseorang memberikan ide bagus tentang cara mengatasi kasus pembaruan yang terus-menerus ini?

Jawaban:


12

Game Coding Complete menjelaskan loop Pembaruan dengan baik. Ini hanya loop sementara yang berjalan di kelas utama Anda yang melakukan hal berikut (kurang lebih):

while( game.isRunning )  
{  
  GetInput();
  Update( dt );
  Render();
}

Anda lulus dalam dt (waktu delta) tergantung pada apakah Anda ingin game Anda berjalan pada frame rate yang tetap atau variabel. Untuk frame rate tetap, ini tidak perlu.

Sekarang untuk melakukan apa yang ingin Anda lakukan dengan mudah adalah menggunakan gagasan vektor 2D, di mana satu vektor mewakili posisi monster (x, y) dan vektor kecepatan yang mewakili arah perjalanan monster itu (dalam satuan / detik) ).

Jadi untuk membuat monster dengan kecepatan berbeda, yang perlu Anda lakukan adalah mengubah vektor kecepatan menjadi apa pun yang Anda inginkan dan biarkan fungsi monster.update () menanganinya untuk Anda.

Sebagai contoh:

Monster monster = new Monster();
monster.position = new Vector2( 0, 0 );
monster.velocity = new Vector2( 1, 0 );   // Every frame I want the monster 
                                          // to move 1 unit to the right

Dan metode pembaruan Anda akan terlihat seperti ini (untuk frame rate tetap 60 frame per detik):

monster.position += monster.velocity * ( 1.0f / 60.0f ); // The ( 1.0f / 60.0f ) would  
                                                         // be dt if it was passed into the Update() method

Ini dikenal sebagai metode pembaruan Euler dan ini adalah metode yang sangat mudah dan langsung untuk menerapkan persamaan gerak.

Semoga ini membantu.


+1 untuk penjelasan yang bagus. Saya akan mengatakan bahwa layak untuk menyebutkan bahwa "waktu variabel" bukan satu-satunya pendekatan (meskipun favorit pribadi saya) untuk menentukan waktu loop pembaruan, waktu variabel vs waktu tetap sering diperdebatkan di tempat-tempat seperti ini dan layak cari :)
Zaky German

3

Pada dasarnya, saya menggunakan loop pembaruan dan bukan sistem berbasis acara.

Untuk memperbarui monster, Anda dapat mengulangi daftar monster dan memperbaruinya dalam loop pembaruan dengan, katakanlah, monster.update()

Jika monster harus berjalan, ia harus memperbarui posisinya. Jadi, dalam metode pembaruan saya menghitung posisi baru berdasarkan waktu yang telah berlalu, yang disimpan dalam kelas 'timer' yang terpisah.

Itu seharusnya semua 'berjalan';)


Kami memiliki metode untuk pergerakan monster. Itu cukup sederhana. Masalahnya adalah bagaimana membuat monster untuk bergerak, dan menara untuk menembak, ketika mereka memiliki "kecepatan" yang berbeda ...
Øyvind

1
@ Øyvind: Cukup berikan waktu yang berlalu sebagai parameter ke metode pembaruan. Kemudian monster dapat menghitung posisi barunya dengan bergerak elapsedTime * movementPerSecond. Atau Anda bisa memiliki cooldown di menara penembakan: if(cooldown > 0){ cooldown -= elapsedTime } else { cooldown = X, shoot(); }dll.
bummzack

2

Saya kira itu akan memenuhi tujuannya dengan baik untuk proyek uni, tetapi dalam permainan nyata saya akan memiliki kelas monster konkret, dan alih-alih subklasifikasi jenis, minta berbagai jenis monster yang dijelaskan dalam file data. Kecepatan, titik kesehatan, resistensi terhadap berbagai jenis kerusakan dan sprite dapat dengan sempurna dijelaskan dalam file, itu akan memudahkan Anda untuk menambahkan jenis monster baru ke gim Anda, dan Anda tidak perlu mengkompilasi setiap kali Anda menginginkannya. ingin melakukannya.

Pokoknya, soal pergerakan. Berikan semua objek "bergerak" Anda yang berbeda dengan variabel kecepatan. Setiap frame dalam logika game Anda, Anda loop melalui semua objek yang bergerak dan melakukan sesuatu seperti

object.x += Math.cos(object.angle) * object.speed * timeSinceLastIteration;
object.y += Math.sin(object.angle) * object.speed * timeSinceLastIteration;

Ini berlaku untuk monster, rudal dari menara, dll ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.