EDIT: Untuk memperjelas apa sebenarnya pertanyaan saya: apakah ini cara yang baik untuk menangani kondisi animasi / animasi dalam mesin game dengan memperhatikan pembuatan / manajemen konten? Apa kelemahan dalam melakukannya dengan cara ini dan apa yang akan menjadi cara alternatif untuk melakukannya? - Meskipun jawaban saya sebagian dijawab dalam komentar, sepertinya itu cara untuk pergi.
Saya mencoba untuk menangani animasi dalam game engine 2D proyek hobi, tanpa hard-coding mereka. Status animasi hard coding sepertinya seperti fenomena umum tapi sangat aneh, bagi saya.
Sedikit latar belakang: Saya bekerja dengan sistem entitas di mana komponen adalah kantung data dan subsistem bertindak atas mereka. Saya memilih untuk menggunakan sistem polling untuk memperbarui status animasi.
Dengan status animasi yang saya maksud: "walking_left", "running_left", "walking_right", "shooting", ...
Ide saya untuk menangani animasi adalah mendesainnya sebagai model yang didorong data . Data dapat disimpan dalam file xml, rdbms, ... Dan dapat dimuat di awal gim / level / ... Dengan cara ini Anda dapat dengan mudah mengedit animasi dan transisi tanpa harus mengubah kode di mana pun di Anda permainan.
Sebagai contoh, saya membuat konsep xml dari definisi data yang ada dalam pikiran saya.
Satu bagian data yang sangat penting adalah deskripsi animasi . Animasi akan memiliki id unik (nama deskriptif). Ini akan menyimpan id referensi ke gambar (sprite sheet yang digunakannya, karena animasi yang berbeda mungkin menggunakan sprite sheet yang berbeda). Frame per detik untuk menjalankan animasi. "Replay" di sini menentukan apakah animasi harus dijalankan sekali atau tanpa batas. Lalu saya mendefinisikan daftar persegi panjang sebagai bingkai.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
Data animasi akan dimuat dan disimpan dalam kumpulan sumber daya animasi dan direferensikan oleh entitas game yang menggunakannya. Itu akan diperlakukan sebagai sumber daya seperti gambar, suara, tekstur, ...
Bagian kedua dari data yang akan didefinisikan adalah mesin keadaan untuk menangani keadaan animasi dan transisi. Ini mendefinisikan setiap negara bagian entitas game, yang menyatakan bahwa ia dapat bertransisi dan apa yang memicu perubahan itu.
Mesin negara ini akan berbeda dari satu entitas ke entitas lainnya. Karena seekor burung mungkin memiliki status "berjalan" dan "terbang" sedangkan manusia hanya akan menyatakan "berjalan". Namun itu dapat dibagi oleh entitas yang berbeda karena banyak manusia mungkin akan memiliki status yang sama (terutama ketika Anda mendefinisikan beberapa NPC umum seperti monster, dll). Selain itu, orc mungkin memiliki status yang sama dengan manusia. Hanya untuk menunjukkan bahwa definisi keadaan ini mungkin dibagikan tetapi hanya oleh sekelompok entitas permainan tertentu .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Negara-negara ini dapat ditangani oleh sistem pemungutan suara . Setiap game mencentangnya mengambil status entitas game saat ini dan memeriksa semua pemicu. Jika suatu kondisi terpenuhi akan mengubah status entitas menjadi status "kebagian".
Bagian terakhir yang saya perjuangkan adalah bagaimana cara mengikat data animasi dan status animasi ke suatu entitas . Pendekatan yang paling logis bagi saya adalah menambahkan pointer ke data state machine yang digunakan entitas dan menentukan untuk setiap state di mesin tersebut animasi apa yang digunakannya.
Berikut ini adalah contoh xml bagaimana saya akan mendefinisikan perilaku animasi dan representasi grafis dari beberapa entitas umum dalam game, dengan membahas status animasi dan id data animasi. Perhatikan bahwa "penyihir" dan "orc" memiliki status animasi yang sama tetapi animasi yang berbeda. Juga, animasi yang berbeda dapat berarti sprite sheet yang berbeda, atau bahkan urutan animasi yang berbeda (animasi bisa lebih panjang atau lebih pendek).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Ketika entitas sedang dibuat itu akan menambahkan daftar negara dengan data mesin negara dan referensi data animasi.
Di masa depan saya akan menggunakan sistem entitas untuk membangun seluruh entitas dengan mendefinisikan komponen dalam format xml yang serupa.
-
Inilah yang saya hasilkan setelah beberapa penelitian. Namun saya memiliki beberapa kesulitan untuk mengatasinya, jadi saya berharap untuk mendapatkan umpan balik. Adakah sesuatu di sini yang tidak masuk akal, atau adakah cara yang lebih baik untuk menangani hal-hal ini? Saya memahami gagasan iterasi melalui frame tapi saya mengalami kesulitan untuk mengambilnya selangkah lebih maju dan ini adalah upaya saya untuk melakukan itu.