Apakah ada pola yang diterima secara umum untuk melakukan berbagai aksi dalam game? Cara pemain dapat melakukan tindakan dan juga bahwa AI dapat melakukan tindakan, seperti bergerak, menyerang, menghancurkan diri sendiri, dll.
Saat ini saya memiliki BaseAction abstrak yang menggunakan .NET generics untuk menentukan objek berbeda yang dikembalikan oleh berbagai tindakan. Ini semua diimplementasikan dalam pola yang mirip dengan Komando, di mana setiap tindakan bertanggung jawab untuk dirinya sendiri dan melakukan semua yang diperlukan.
Alasan saya untuk menjadi abstrak adalah agar saya dapat memiliki ActionHandler tunggal, dan AI hanya dapat mengantri tindakan yang berbeda menerapkan baseAction. Dan alasannya generik adalah agar tindakan yang berbeda dapat mengembalikan informasi hasil yang relevan dengan tindakan tersebut (karena tindakan yang berbeda dapat memiliki hasil yang sama sekali berbeda dalam permainan), bersama dengan beberapa implementasi sebelum Aksi dan pasca Aksi yang umum.
Jadi ... apakah ada cara yang lebih diterima untuk melakukan ini, atau apakah ini terdengar baik-baik saja?
sumber
Jawaban:
Saya tidak berpikir ada satu cara yang diterima untuk menerapkan konsep ini, tetapi saya benar-benar ingin berbagi bagaimana saya biasanya menangani ini dalam permainan saya. Ini sedikit kombinasi dari pola desain Perintah dan pola desain Komposit .
Saya memiliki kelas dasar abstrak untuk tindakan yang tidak lebih dari pembungkus di sekitar
Update
metode yang dipanggil setiap frame, danFinished
bendera untuk menunjukkan kapan tindakan selesai berjalan.Saya juga menggunakan pola desain komposit untuk membuat jenis tindakan yang mampu menampung dan menjalankan tindakan lain. Ini juga kelas abstrak. Bermuara ke:
Kemudian saya memiliki dua implementasi tindakan gabungan, satu untuk eksekusi paralel dan satu untuk eksekusi berurutan . Tetapi keindahannya adalah karena paralel dan urutan adalah tindakan itu sendiri, mereka dapat digabungkan untuk menciptakan aliran eksekusi yang lebih kompleks.
Dan yang mengatur tindakan berurutan.
Dengan ini, itu hanya masalah menciptakan implementasi tindakan konkret, dan menggunakan
Parallel
danSequence
tindakan untuk mengontrol aliran eksekusi. Saya akan mengakhiri dengan sebuah contoh:Saya telah berhasil menggunakan sistem ini untuk menggerakkan semua gameplay dalam petualangan grafis sebelumnya, tetapi mungkin bisa bekerja untuk apa saja. Itu juga cukup sederhana untuk menambahkan jenis tindakan komposit lainnya, yang digunakan untuk membuat loop eksekusi dan kondisional.
sumber
Draw
metode ini sudah dibangun di atas keadaan entitas, dan perubahannya otomatis. Dalam penyaji-mode dipertahankan seperti Flash, Anda bisa menggunakan pola yang bisa diamati untuk membuat perubahan pada entitas Anda menyebar ke objek tampilan, atau membuat koneksi secara manual di dalam entitas itu sendiri.Character
kelas Anda memilikiPosition
properti, danDraw
metode yang membaca apa nilai saat iniPosition
adalah dan menggambar gambar yang benar di sana. Dalam situasi ini, Anda hanya perlu memperbarui nilaiPosition
bahwa hasilnya akan secara otomatis terlihat di layar.Character
memilikiPosition
properti, tetapi mendelegasikan render ke semacamSprite
objek yang secara otomatis ditampilkan oleh grafik adegan atau sesuatu. Dalam situasi ini, Anda harus memastikan bahwa posisi karakter dan posisi sprite selalu sinkron, yang melibatkan sedikit lebih banyak pekerjaan. Namun, dalam kedua kasus, saya tidak melihat mengapa manajer tindakan harus ada hubungannya dengan itu. :)