Mengabstraksi status animasi Sistem Entitas

8

Saya baru-baru ini mulai merancang Game Engine menggunakan paradigma Entity System, yaitu memiliki entitas sebagai agregasi komponen, dan sistem yang mengimplementasikan game yang sebenarnya. Sedangkan saya telah mengalami kesulitan dalam berbagai aspek, yang paling saya perhatikan adalah abstraksi / modularitas dari berbagai Komponen / Sistem. Secara khusus, katakanlah saya Playermemiliki beberapa status animasi, mis. Walking, Sleeping, Jumping, Dan satu jenis Opponententitas memiliki beberapa (tidak harus sama) negara juga, misalnya. Walking, Hidingdll.

Bagaimana saya harus mendesain mesin, sehingga menangani berbagai (animasi) keadaan masing-masing jenis entitas? Haruskah ada Sistem animasi yang berbeda untuk setiap jenis Entitas? Haruskah saya menggunakan tanda yang menandakan Sistem animasi untuk membuat entitas yang benar? Juga, dapatkah saya menghindari penggunaan enum "hard-coded" untuk berbagai pose? Saya dapat melihat bahwa sistem scripting mungkin bisa membantu, tapi saya hampir yakin ada solusi yang lebih sederhana.

petermer
sumber

Jawaban:

4

Tidak untuk sistem yang berbeda untuk setiap jenis, itu memotong pembagian tanggung jawab terlalu baik.

Inilah yang saya lakukan dalam proyek pribadi saya saat ini:

Ada banyak cara untuk menangani keadaan tetapi Anda mungkin membutuhkannya yang masuk akal bagi manusia, atau setidaknya jembatan antara manusia dan kode. Anda harus menganggap sistem animasi sebagai blender besar alih-alih salah satu kondisi terpisah, misalnya Anda beralih dari diam ke berjalan lambat dengan menambahkan 50% jalan ke sistem dan kemudian menambahkan 100% berjalan.

Di luar sistem animasi Anda dapat menggunakan string untuk membuat bekerja dengan sistem yang menyenangkan dan mudah untuk skrip dan kode. Di dalam sistem Anda membangun pemetaan antara string itu dan data animasi , ini bisa dilakukan dengan kunci-nilai toko seperti hashmap (untuk menghindari sama sekali dengan membuat data animasi toko) atau dengan string-to-enum cari jika Anda suka bekerja seperti itu. Itu semua masalah selera pada saat itu. Saya lebih suka nilai kunci karena dapat sepenuhnya didorong data dari file XML atau INI.

Untuk menangani berbagai jenis, Anda dapat, pada lapisan sistem, memungkinkan untuk membuat set pemetaan animasi sehingga set untuk "minion" dan "run" untuk "minion" berbeda dari set untuk "run" dan "pemain wanita" Tipe.

Singkatnya: sistem animasi adalah generik dan Anda hanya memiliki satu sistem; dunia luar membutuhkan antarmuka yang ramah; dunia dalam perlu memetakan status generik ke tipe entitas.

Dan daftar hal-hal yang ingin saya lakukan tetapi belum masuk ke dalam desain saya:

TODO : memetakan kecepatan gerakan ke jenis animasi secara otomatis sehingga alih-alih memiliki program utama yang tahu tentang "berjalan" versus "jalankan" sistem animasi dapat mengkonversi "bergerak dengan kecepatan x" ke animasi yang tepat.

TODO : pisahkan animasi seperti pelacakan kepala dan batang secara transparan.

TODO : animasi reaksi (seperti dipukul di wajah) ditangani oleh sistem dan bukan program utama.

Patrick Hughes
sumber
Jadi, Anda sarankan menggunakan beberapa ifdi dalam sistem animasi; Saya sebelumnya ragu menggunakan kamus string (dalam bahasa C ++), berdasarkan ingatan. Setelah membaca hari ini tentang hashtable, saya menemukan jawaban Anda cukup sederhana. Mengenai, bagian 'blender': Apakah "menambahkan 50% berjalan" berarti mengganti beberapa bingkai dengan yang 'berjalan' pada 50% dari waktu?
petermer
Memadukan adalah istilah yang cukup umum dalam animasi, secara harfiah berarti Anda menggabungkan dua (atau lebih) animasi dasar bersama untuk mendapatkan hasil akhir. Dalam contoh 50% saya mengasumsikan campuran 50% "Idle" dan 50% "Walk" yang akan menghasilkan fowards berjalan setengah kecepatan. Dengan cara ini Anda dapat secara terus menerus memvariasikan gerakan dari "Idle" ke "Walk" dan kemudian "Run." Pencampuran nantinya akan membiarkan Anda melakukan hal-hal seperti memiliki tubuh bagian bawah berjalan ketika tubuh bagian atas menembakkan senjata, atau melambai pada seseorang, dll ... Jika mesin animasi Anda tidak mendukung pencampuran, gunakan ini sebagai cara untuk memikirkannya dan bukan aturan.
Patrick Hughes
1
FYI: mengkhawatirkan memori untuk string dalam program Anda pada tahap ini adalah waktu yang terbuang, itu disebut "optimasi prematur" dan umumnya ide yang buruk. Kemudian, jika string benar-benar menyebabkan beban yang sangat besar, mereka dapat diubah menjadi nomor CRC pendek untuk menyusutkan semuanya, dengan mengorbankan kemudahan debugging dan langkah ekstra untuk proses build Anda.
Patrick Hughes