Saya belum pernah benar-benar melakukan banyak pemrograman game sebelumnya, pertanyaan yang cukup mudah.
Bayangkan saya membangun game Tetris, dengan loop utama terlihat seperti ini.
for every frame
handle input
if it's time to make the current block move down a row
if we can move the block
move the block
else
remove all complete rows
move rows down so there are no gaps
if we can spawn a new block
spawn a new current block
else
game over
Semua yang ada dalam game sejauh ini terjadi secara instan - semuanya muncul secara instan, baris dihapus secara instan, dll. Tetapi bagaimana jika saya tidak ingin hal-hal terjadi secara instan (yaitu hal-hal yang bernyawa)?
for every frame
handle input
if it's time to make the current block move down a row
if we can move the block
move the block
else
?? animate complete rows disappearing (somehow, wait over multiple frames until the animation is done)
?? animate rows moving downwards (and again, wait over multiple frames)
if we can spawn a new block
spawn a new current block
else
game over
Dalam klon Pong saya ini bukan masalah, karena setiap frame saya hanya menggerakkan bola dan memeriksa tabrakan.
Bagaimana saya bisa mengatasi masalah ini? Tentunya sebagian besar permainan melibatkan beberapa aksi yang membutuhkan lebih dari satu frame, dan hal-hal lain berhenti sampai aksi selesai.
Action
kelas dan antrian tindakan untuk dilakukan. Ketika suatu tindakan selesai, hapus dari antrian dan lakukan tindakan selanjutnya dll. Jauh lebih fleksibel daripada mesin-keadaan.Saya mengambil ini dari Game Coding Lengkap oleh Mike McShaffry.
Dia berbicara tentang 'Manajer Proses', yang bermuara pada daftar tugas yang perlu dilakukan. Misalnya, suatu proses akan mengontrol animasi untuk menggambar pedang (AnimProcess), atau membuka pintu, atau dalam kasus Anda, membuat baris menghilang.
Proses akan ditambahkan ke daftar manajer proses, yang akan diulang setiap frame dan Pembaruan () dipanggil masing-masing. Entitas yang sangat mirip, tetapi untuk tindakan. Akan ada bendera kill untuk dihapus dari daftar ketika sudah selesai.
Hal lain yang rapi tentang mereka adalah bagaimana mereka dapat terhubung, dengan memiliki pointer ke proses selanjutnya. Dengan cara ini, proses baris animate Anda sebenarnya terdiri dari:
(Karena proses dapat berupa hal-hal sekali pakai, kondisional di sana, atau di sana untuk jumlah waktu X)
Jika Anda ingin lebih detail, tanyakan saja.
sumber
Anda dapat menggunakan antrian tindakan prioritas. Anda mendorong suatu tindakan, dan waktu. Setiap frame, Anda mendapatkan waktu, dan Anda menghapus semua tindakan yang memiliki waktu yang ditentukan seperti sebelumnya dan menjalankannya. Bonus: Pendekatan sejajar dengan baik, dan Anda benar-benar dapat menerapkan hampir semua logika game dengan cara ini.
sumber
Anda selalu perlu tahu perbedaan waktu antara frame sebelumnya dan saat ini, maka Anda harus melakukan dua hal.
-Putuskan kapan untuk memperbarui model Anda: mis. di tetris ketika penghapusan baris dimulai, Anda tidak ingin hal-hal bertabrakan dengan baris lagi, jadi Anda menghapus baris dari 'model' aplikasi Anda.
-Anda kemudian harus menangani objek yang berada dalam keadaan transisi ke kelas terpisah yang menyelesaikan animasi / acara selama periode waktu tertentu. Pada contoh tetris Anda akan membuat baris memudar perlahan (ubah sedikit kekeruhan setiap frame sedikit). Setelah opaqueness adalah 0, Anda mentransfer semua blok di atas baris satu ke bawah.
Ini mungkin tampak sedikit rumit pada awalnya, tetapi Anda akan memahami ini, pastikan untuk banyak abstrak di kelas yang berbeda, ini akan membuatnya lebih mudah. Pastikan juga bahwa peristiwa yang membutuhkan waktu, seperti menghilangkan baris dalam tetris, adalah jenis "Fire and Forget", buat saja objek baru yang menangani semua yang perlu dilakukan secara otomatis dan ketika semuanya dilakukan, menghapus sendiri dari scenegraph Anda.
sumber
Anda harus menganggap permainan sebagai "mesin negara yang terbatas". Gim ini dapat berada di salah satu dari beberapa negara bagian: dalam kasus Anda, "mengharapkan input", "bagian bergerak ke bawah", "baris meledak".
Anda melakukan berbagai hal tergantung pada negara. Misalnya, selama "bagian bergerak ke bawah" Anda mengabaikan input pemain, dan sebaliknya menghidupkan bagian dari baris saat ini ke baris berikutnya. Sesuatu seperti ini:
sumber