Katakanlah Anda memiliki animasi yang Anda inginkan terjadi ketika menembakkan peluru. Bagaimana Anda mendapatkan peluru muncul di akhir animasi. Satu-satunya hal yang saya tahu adalah mengetahui panjang waktu animasi, dan menunda pengaturan posisi peluru dan mengaturnya aktif sampai jumlah waktu telah berlalu. Saya hanya ingin tahu apakah ini pendekatan terbaik, bagaimana orang lain menangani ini?
EDIT: Saya pikir saya mengalami masalah dalam mengeja pertanyaan dengan benar.
Jawaban:
Pada dasarnya Anda berada di jalur yang benar - Anda perlu tahu berapa lama animasi berlangsung untuk melakukan hal semacam ini. Animasi lebih dari sekadar kumpulan bingkai, ada segala macam informasi lain di sekitar mereka yang Anda butuhkan. Misalnya berapa banyak frame yang ada, apakah loop animasi, seberapa cepat pemutarannya (misalnya 10 frame animasi per detik atau 25, atau 60?). Setiap animasi dapat didefinisikan dalam beberapa bagian data, yang dapat dilihat dan diputar ulang oleh beberapa kode animasi umum. Anda harus merangkum bagian animasi dalam sedikit kode sendiri, yang tidak mengetahui apa-apa kecuali definisi animasi ini dan cara menampilkan masing-masing bingkai gambar. Artinya, miliki objek animasi yang dapat Anda muat, mulai mainkan, hentikan mainnya, dan suruh untuk merender di lokasi tertentu di layar.
Pendekatan yang fleksibel adalah dengan menggunakan semacam definisi animasi untuk merangkum informasi semacam ini. Jadi daripada hanya mengatakan "animasi X adalah semua frame ini, cukup mainkan melalui mereka", Anda mendapatkan sesuatu yang sedikit lebih kompleks.
Misalnya dengan semacam format data mocked up
Jadi kode Anda mengatakan sesuatu seperti:
Cara Anda mendeteksi peristiwa bisa dengan kode animasi yang memanggil Anda kembali (yaitu ketika ia mendeteksi acara baru karena animasi telah diputar ke bingkai tertentu, ia memanggil kode permainan Anda untuk memberi tahu tentang acara baru), atau dengan polling animasi seperti ini:
Poin yang perlu diperhatikan:
Jika Anda tidak memerlukan tembakan peluru untuk terjadi di dalam animasi, tetapi hanya setelah itu selesai, Anda dapat pergi dengan sistem yang jauh lebih kompleks tanpa gagasan peristiwa. Tetapi Anda masih menginginkan sistem tempat animasi diputar sendiri, tahu berapa lama, dan dapat memanggil kembali kode permainan saat animasi selesai.
sumber
Dalam beberapa cara, Anda harus menunggu sampai animasi selesai dan membuat peluru pada saat itu.
Pengaturan timer saja akan berhasil, jika Anda yakin laju animasi Anda sudah tetap. Sebagai variasi kecil, Anda dapat memiliki kode internal ke peluru yang membuatnya menunggu sebentar sebelum muncul dan bergerak.
Bergantung pada platform pengembangan Anda, Anda mungkin memiliki semacam fungsi pembaruan animasi atau panggilan balik yang akan memungkinkan Anda merespons saat yang tepat animasi mencapai titik yang diinginkan. Inilah yang saya lakukan dengan Flixel, misalnya.
sumber
addAnimationCallback
Metode Flixel dapat digunakan pada entitas firing. Dalam fungsi panggilan balik, Anda dapat melihat apakah bingkai animasi penembakan saat ini adalah bingkai yang seharusnya membuat entitas bullet. Jika sudah maka Anda bisa menambahkan peluru di layar.Jawaban lurus ke depan: Dengan asumsi Anda memiliki animasi yang ingin Anda mainkan ketika pemain menekan tombol 'tembak', dan kemudian peluru keluar setelah selesai bermain. Idealnya, Anda harus menghindari pengkodean waktu animasi yang sulit, dan menembakkan peluru ketika animasi selesai (menggunakan fungsi panggilan balik atau sesuatu, tergantung pada platform Anda). Saya tidak dapat memikirkan metode lain untuk melakukan ini yang tidak terlalu rumit.
Alternatif Desain Game jawaban: Kecuali ada yang benar- benar bagus untuk melakukannya, saya akan menghindari penundaan menekan tombol 'tembak' dan membiarkan peluru muncul. Kecuali jika animasinya benar-benar pendek (satu atau dua frame, maks, pada dasarnya moncong flash), itu akan membuat respons tombol api terasa lambat, dan itu hanya akan mengganggu pemain biasa. Bahkan jika Anda memutuskan untuk menggunakan animasi sebelum peluru keluar (giliran berbasis RPG dan permainan taktis akan menjadi alasan yang dapat diterima untuk melakukan ini), saya akan berpikir tentang menyertakan opsi "matikan animasi" di suatu tempat, untuk memungkinkan permainan untuk bergerak lebih cepat jika pemain menginginkannya.
sumber
Seperti kata MrCranky; pisahkan animasi dan logika.
Tetapi yang paling penting, logika harus tetap menjadi bagian utama .
Ingatlah bahwa mengendalikan UI dari logika adalah satu-satunya cara untuk memastikan Anda dapat menyimpan, menggunakan kembali, dan membagikan logika Anda nanti (renderer baru, game baru, versi server tanpa renderer ...)
sumber
Pertama, saya akan menggunakan sistem acara (pola pengamat?) Untuk memisahkan potongan-potongan kode. Ini bukan hanya untuk animasi, tetapi tentu saja berlaku di sana. Kemudian kode animasi dapat dengan mudah mengatakan dispatchEvent (event) dan beberapa bagian lain dari kode mendengarkan acara tersebut, tanpa ada bagian dari kode yang perlu saling mengetahui.
Sekarang kode animasi harus benar-benar memiliki referensi ke dispatcher acara (mudah dilakukan dengan injeksi ketergantungan) dan Anda perlu memiliki beberapa XML atau JSON yang benar-benar mendefinisikan animasi Anda. Sesuatu seperti:
Baca dalam data saat memuat animasi, dan minta kode animasi mengirim acara ketika berada di bingkai itu selama pemutaran.
sumber