背景
我将游戏开发作为一种业余爱好,并且正在寻找一种更好的设计方式。目前,我正在使用一种标准的OOP方法(我从事企业开发已经8年了,所以很自然)。以“坏蛋”为例
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
}
问题
可以说我正在制作2D平台游戏,并且需要坏家伙能够跳转。通常我要做的是在Update / GetInput方法中添加适当的代码。然后,如果我需要让玩家爬行,俯卧,攀爬等,代码就会去那里。
如果我不小心,这些方法会变得混乱,因此我最终会像这样创建方法对
CheckForJumpAction(Input input)
和 DoJump()
CheckforDuckAction(Input input)
和 DoDuck()
所以GetInput看起来像
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
和更新看起来像
public void Update()
{
DoJump();
DoDuck();
}
如果我去创建另一个需要玩家跳跃和躲避的游戏,我通常会进入具有该功能并将其复制的游戏。凌乱,我知道。那就是我为什么要寻找更好的东西。
解?
我真的很喜欢Blend的行为可以附加到元素上。我一直在考虑在游戏中使用相同的概念。因此,让我们看一下相同的示例。
我将创建一个基本的Behavior对象
public class Behavior
{
public void Update()
Public void GetInput()
}
我可以使用它来创建行为。JumpBehavior:Behavior
和DuckBehavior:Behavior
然后,我可以将行为集合添加到Sprite库中,并将我需要的内容添加到每个实体中。
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
}
}
因此,现在如果我想在许多游戏中使用Jump and Duck,我就可以将这些行为改过来。我什至可以为普通图书馆建立图书馆。
它行得通吗?
我不知道的是如何在它们之间共享状态。查看Jump和Duck,不仅会影响要绘制的纹理的当前部分,还会影响播放器的状态。(随着时间的推移,跳跃将施加递减的向上力,而鸭子则将停止移动,改变坏蛋的质地和碰撞大小。
我如何将它们绑在一起才能起作用?是否应该在行为之间创建依赖项属性?我应该让每个行为都了解父级并直接对其进行修改吗?我认为的一件事是能够将委托传递给每个行为,以便在触发时执行。
我确定我正在寻找更多问题,但是整个目的是让我能够轻松地在游戏和同一游戏中的实体之间重用这些行为。
所以我把它交给你。仔细说明如何/是否可以这样做?你有更好的主意吗?我全是耳朵。