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.
Jawaban:
Klip animasi paling baik dijelaskan dalam data lama, seperti yang Anda lakukan pada cuplikan XML pertama. Anda dapat membuatnya dengan tangan, atau mengekspornya dari paket seni. Apa pun itu, Anda mungkin ingin membuat saluran pipa yang mengambilnya dari format perantara yang dapat dibaca manusia seperti XML dan memasukkannya ke dalam sesuatu yang bagus dan cepat dimuat.
Langkah selanjutnya adalah mampu membuat hal itu. Jika Anda menggunakan semacam grafik adegan, itu mungkin berarti membuat Anim Node untuknya. Anda harus dapat memberi tahu animode animasi mana yang sedang diputar, dan di mana dalam timeline saat ini. Pastikan Anda menyimpan informasi kotak terikat agar dapat diakses pada tingkat ini sehingga Anda dapat dengan mudah memasukkannya ke sistem pemusnahan Anda.
Sekarang, Anda ingin mengaitkan animasi dengan entitas game. Saya cenderung menggunakan model berbasis komponen, jadi bagi saya ini berarti dan komponen AnimState. Ini adalah lapisan perantara Anda antara gameplay dan rendering. Ia melacak animasi mana yang dimainkan suatu entitas, playmode (perulangan, sekali, ping-pong, dll), pewaktuan, dll. Ia dapat mengirim acara seperti "animover" kembali ke entitas, dan memperbarui status animnode bila perlu . AnimStates untuk entitas aktif akan diperbarui sekali per centang sim jika mereka memainkan animasi.
Komponen animstate mungkin cukup untuk item permainan sederhana (alat peraga latar belakang dasar dan sejenisnya), tetapi untuk entitas yang lebih rumit Anda ingin menggunakan mesin negara untuk mengaturnya. Ini paling baik diungkapkan dalam bahasa scripting seperti Lua atau Python. Suatu negara dapat memiliki beberapa blok fungsional (onEnter, onExit, onUpdate, onEvent), serta garis waktu yang menentukan tindakan dan pemicu tertentu yang harus terjadi pada waktu tertentu. Anda mungkin akan memiliki semacam kelas manajer yang bertanggung jawab untuk memperbarui mesin negara ini sebagaimana mestinya, serta memicu callback timeline ketika mereka terjadi. Anda harus mencoba untuk menjaga hal-hal ini sebagai berbasis peristiwa mungkin, karena setiap OnUpdate yang Anda tulis akan menjadi biaya linier dengan jumlah entitas. Anda juga ingin menentukan tag ('menyerang', 'idle', 'abaikan masukan', dll.) yang dikaitkan dengan seluruh negara bagian dan wilayah waktu negara bagian tertentu. Anda mungkin juga ingin beberapa penangan acara tingkat tinggi yang berlaku untuk seluruh grafik keadaan, dan bukan hanya keadaan tertentu.
Karakter 'Sentient' mungkin akan memiliki semacam AI juga. Saya cenderung membuat komponen 'penggerak' khusus yang menangani jalan-jalan. Ini berinteraksi dengan stategraph menggunakan sistem sinyal dan peristiwa dan permintaan tag-negara, dan dapat dikatakan "berjalan ke titik", atau "berjalan ke arah tertentu dengan kecepatan tertentu". Komponen AI tingkat tinggi (seperti pohon perilaku atau apa pun) kemudian dapat menggunakan antarmuka ini tanpa khawatir tentang detailnya.
sumber
Sistem animasi berbasis data terbaik yang pernah saya lihat sejauh ini adalah Blend Tree . Sungguh, ini sangat bagus dan dapat melakukan semua yang Anda minta di sini. Menurut AIGameDev.com sekarang standar de-facto di industri, dan saya percaya mereka benar.
Sayangnya saya tidak menemukan sumber yang bagus dengan googling cepat, tetapi Anda dapat mencoba ini atau itu untuk mendapatkan gambaran umum. Ada juga artikel berbayar di AIGameDev.com, tidak tahu apakah layak mendapatkan akun premium.
sumber