Arka fon
Oyun geliştirmeyi hobi olarak yapıyorum ve onları tasarlamanın daha iyi bir yolunu arıyorum. Şu anda, standart bir OOP yaklaşımı kullanıyorum (8 yıldır kurumsal gelişim yapıyorum, bu yüzden nartely geliyor). Örneğin bir "kötü adam"
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
}
Sorun
Diyelim ki ben 2 boyutlu bir platform yapıyorum ve Zıplayabilmek için baddie'ye ihtiyacım var. Genellikle ne yaptığımı Update / GetInput yöntemlerine uygun kodu ekleyin. Sonra oyuncuyu taramak, ördek, tırmanış vb yapmak gerekiyorsa ... kod oraya gidecek.
Eğer dikkatli olmazsam, bu yöntemler karmaşıklaşır, bu yüzden böyle yöntemler çiftleri oluştururum
CheckForJumpAction(Input input)
ve DoJump()
CheckforDuckAction(Input input)
ve DoDuck()
yani GetInput şöyle görünür
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
ve Güncelleme
public void Update()
{
DoJump();
DoDuck();
}
Eğer gidip oyuncunun atlaması ve ördek atması gereken başka bir oyun yaratırsam, genellikle işlevselliğe sahip bir oyuna girer ve kopyalarım. Dağınık, biliyorum. Bu yüzden daha iyi bir şey arıyorum.
Çözüm?
Blend'in bir öğeye ekleyebileceğim davranışlarını gerçekten seviyorum. Oyunlarımda da aynı konsepti kullanmayı düşünüyorum. Şimdi aynı örneklere bakalım.
Temel bir Davranış nesnesi oluştururdum
public class Behavior
{
public void Update()
Public void GetInput()
}
Ve bunu kullanarak davranışlar oluşturabilirim. JumpBehavior:Behavior
veDuckBehavior:Behavior
Sonra Sprite tabanına davranışlar bir koleksiyon eklemek ve her varlık için ne gerek eklemek.
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
}
}
Şimdi Jump ve Duck'ı birçok oyunda kullanmak istersem, sadece davranışları ortaya çıkarabilirim. Sıradanlar için bir kütüphane bile yapabilirim.
Çalışıyor mu?
Anlayamadığım şey, devletlerin aralarında nasıl paylaşılacağıdır. Atlama ve Ördek'e bakıldığında, her ikisi de sadece çizilen dokunun geçerli kısmını değil, aynı zamanda oyuncunun durumunu da etkiler. (Atlama zamanla azalan miktarda yukarı doğru kuvvet uygularken, ördek sadece hareketi durduracak, baddie'nin dokusunu ve çarpışma boyutunu değiştirecek.
Çalışması için bunu nasıl birbirine bağlayabilirim? Davranışlar arasında bağımlılık özellikleri oluşturmalı mıyım? Her davranış olmalı bilmesine ebeveyn ile ilgili ve Doğrudan değiştirilemiyor? Düşündüğüm bir şey, bir delege tetiklendiğinde yürütülmesi için her davranışa geçebiliyordu.
Baktığım daha fazla sorun olduğundan eminim, ancak tüm amaç aynı oyundaki oyunlar ve varlıklar arasındaki bu davranışları kolayca yeniden kullanabilmem.
Bu yüzden size teslim ediyorum. Bunun nasıl yapılacağını / yapılacağını açıklamak ister misiniz? Daha iyi bir fikrin var mı? Can kulağı ile dinliyorum.