Latar Belakang
Saya melakukan pengembangan game sebagai hobi, dan saya mencari cara yang lebih baik untuk mendesainnya. Saat ini, saya menggunakan pendekatan OOP standar (saya telah melakukan pengembangan usaha selama 8 tahun sehingga muncul secara nasional). Ambil contoh "baddie"
public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
//sprite base will have things like what texture to use,
//what the current position is, the base Update/Draw/GetInput methods, etc..
//an AnimatedSprite contains helpers to animated the player while
//a StaticSprite is just one that will draw whatever texture is there
}
Masalah
Katakanlah saya membuat platformer 2d, dan perlu baddie untuk dapat Melompat. Biasanya yang saya lakukan adalah menambahkan kode yang sesuai dalam metode Perbarui / GetInput. Lalu jika saya perlu membuat pemain merangkak, bebek, memanjat, dll ... kode akan pergi ke sana.
Jika saya tidak hati-hati, metode-metode itu berantakan, jadi saya akhirnya membuat pasangan metode seperti ini
CheckForJumpAction(Input input)
dan DoJump()
CheckforDuckAction(Input input)
dan DoDuck()
jadi GetInput terlihat seperti
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
dan Pembaruan terlihat seperti
public void Update()
{
DoJump();
DoDuck();
}
Jika saya pergi dan membuat game lain di mana pemain harus melompat dan merunduk, saya biasanya pergi ke permainan yang memiliki fungsi dan menyalinnya. Berantakan, saya tahu. Itulah mengapa saya mencari sesuatu yang lebih baik.
Larutan?
Saya sangat suka bagaimana Blend memiliki perilaku yang dapat saya lampirkan pada suatu elemen. Saya telah berpikir tentang menggunakan konsep yang sama dalam permainan saya. Jadi mari kita lihat contoh yang sama.
Saya akan membuat objek Perilaku dasar
public class Behavior
{
public void Update()
Public void GetInput()
}
Dan saya dapat membuat perilaku menggunakan itu. JumpBehavior:Behavior
danDuckBehavior:Behavior
Saya kemudian dapat menambahkan kumpulan perilaku ke basis Sprite dan menambahkan apa yang saya butuhkan untuk setiap entitas.
public class Baddie:AnimatedSprite
{
public Baddie()
{
this.behaviors = new Behavior[2];
this.behaviors[0] = new JumpBehavior();
//etc...
}
public void Update()
{
//behaviors.update
}
public GetInput()
{
//behaviors.getinput
}
}
Jadi sekarang. Jika saya ingin menggunakan Lompat dan Bebek dalam banyak permainan, saya hanya bisa membawa perilaku itu selesai. Saya bahkan bisa membuat perpustakaan untuk yang umum.
Apakah itu bekerja?
Apa yang saya tidak tahu adalah bagaimana berbagi keadaan di antara mereka. Melihat Jump and Duck, keduanya tidak hanya mempengaruhi bagian tekstur saat ini yang sedang digambar, tetapi juga kondisi pemain. (Lompat akan menerapkan jumlah penurunan ke atas dari waktu ke waktu, sementara bebek hanya akan menghentikan gerakan, mengubah tekstur dan ukuran tumbukan baddie.
Bagaimana saya bisa mengikat ini jadi itu berfungsi? Haruskah saya membuat properti ketergantungan antara perilaku? Haruskah setiap perilaku saya tahu tentang orang tua dan memodifikasinya secara langsung? Satu hal yang saya pikir bisa lulus delegasi ke setiap perilaku untuk dieksekusi ketika dipicu.
Saya yakin ada lebih banyak masalah yang saya perhatikan, tetapi seluruh tujuannya adalah agar saya dapat dengan mudah menggunakan kembali perilaku ini di antara game, dan entitas dalam game yang sama.
Jadi saya menyerahkannya kepada Anda. Mau jelaskan bagaimana / jika ini bisa dilakukan? Apakah Anda punya ide yang lebih baik? Saya mendengarkan.