Status animasi berbasis data

14

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.

pengguna8363
sumber
1
Saya telah datang dengan ide serupa untuk menyimpan data animasi, meskipun saya belum mempertimbangkan pemicunya. Berikut ini adalah artikel pendek yang saya tulis dan tautannya proyek XNA yang saya tulis yang menggunakan XML dan menangani sisi animasi. Saya memiliki beberapa hal yang berbeda, seperti konsep Sets and Sequences, tetapi selain itu, saya pikir Anda berada di jalurnya.
John McDonald
2
Bukan berarti desain Anda buruk (tidak, itu sangat mirip dengan sistem serupa yang saya buat di masa lalu), tapi apa sebenarnya pertanyaan Anda di sini? Saya pikir itu bisa menjadi lebih jelas.
MrCranky
@ John - Terima kasih sobat, saya akan memeriksanya nanti malam. @ MrCranky - Ya, sebagian besar hanya apa yang Anda katakan. Jika ada gunanya dan mungkin tips / tautan ke metode yang lebih mapan. Saya benar-benar dalam kegelapan di sini berdasarkan pengalaman.
user8363
1
Saya ingin memberikan ini upvote untuk kedalaman informasi yang diberikan tetapi, untuk menggemakan MrCranky, saya tidak benar-benar mengikuti apa pertanyaannya. Untuk saran pribadi saya sendiri (yang memunculkan dari membangun sistem semacam ini beberapa minggu yang lalu) saya akan mengatakan Anda tepat.
Mike Cluck
@ MikeC Itu hanya jawaban yang saya butuhkan. Saya minta maaf karena saya tidak bisa menjelaskan pertanyaan saya. Mungkin jika saya tidak tepat akan terlihat lebih seperti pertanyaan :). Faktanya adalah saya tidak dapat menemukan banyak sumber daya yang berhubungan dengan keadaan animasi dan yang melakukan hard-codenya sehingga membuat / mengubah konten akan menjadi mimpi buruk. Jadi pertanyaan saya adalah: apakah pendekatan ini benar atau tidak? Dan jika kalian bilang begitu, maka tidak apa-apa :).
user8363

Jawaban:

4

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.

Kevin
sumber
1

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.

Laurent Couvidou
sumber
Ini sumber yang sangat bagus, terima kasih. Saya mencari informasi seperti ini.
user8363
1
Memadukan animasi tidak dimungkinkan dengan sprite-sheet diskrit, hanya dengan animasi kerangka kontinu
AlexFoxGill