所以我有许多物品都具有不同的属性(砖,玻璃等),并且每种物品都受到元素效果的不同影响。例如砖块材料会受到火或酸的影响,而不是水泥材料。当应用另一个燃烧/熔化效果时,正在燃烧或融化的砖块将受到不同的影响。游戏决策设计模式
在我的游戏中,我有一个FSM,但它非常简单。如果我在砖上放置一个火元素,它会进入燃烧状态。但是,如果我在砖上放了一个水元素,我可能会想让火熄灭,增加健康并改变纹理(或不依赖于当前的组合)。
重点是,我有很多组合之间没有共同点,所以我不能创建一些统一的东西。有时我需要改变纹理,其他时候我不需要。有时在其他时候增加健康的同时造成伤害有时我需要在一个函数中不做任何事情。在这一点上,我可以的事情的唯一的事情是创建一个全球性的映射,如:
FunctionMap [ObjectMaterial] [CurrentObjectState] [ElementBeingApplied]
(即
FunctionMap [砖] [刻录] [酸]
FunctionMap [砖] [熔点] [酸]
)
问题是,是,这显然是由于组合阿瓦伊的量一吨的功能用材料和效果类型标签。任何人都可以推荐一条路线或模式来看待?
尽管与讨论不完全相关,但这是在AS3和Away3D中进行的。
下面是我的一些类的一个实例:
public class Brick extends AbstractBlock implements IFireable
{
public function Brick()
{
super(this);
this.material = new BitmapMaterial(_spriteManager.GetBlockMaterial(BlockUtilities.GetMaterialMap["brick_new"]));
_type = "Brick";
/*
RulesManager.StateMap["Brick"]["OnFire"]["Water"] = some function;
RulesManager.StateMap["Brick"]["OnFire"]["Fire"] = some function;
RulesManager.StateMap["Brick"]["OnFire"]["Acid"] = some function;
RulesManager.StateMap["Brick"]["OnFire"]["Ice"] = some function;
RulesManager.StateMap["Brick"]["OnWater"]["Water"] = some function;
//and so on...there are nine different materials so I'm not liking this way
*/
}
public override function render():void
{
super.render();
}
}
public class OnFire extends AbstractDamage
{
protected var _timeStart:Number = 0;
private var _damageAccumulated:Number = 0;
public function OnFire(block:AbstractBlock,bombType:String)
{
super(block,bombType);
}
public override function enter():void
{
super.enter();
}
public override function exit():void
{
super.exit();
}
public override function update(time:Number):void
{
super.update(time);
if(_timeStart == 0)
_timeStart = time;
var time_delta:Number = (time - _timeStart)/_waitTime;
var damageToSubtract:Number = (time_delta * _damageDone);
_damageAccumulated += damageToSubtract;
_self.Integrity = _self.Integrity - _damageAccumulated;
}
}
}
因此,火元素可以应用到一堆适用。目前正在冻结的那些块现在被击中,现在正在变为OnFire状态。每个块都有自己的状态机,状态本身就是对象,正如你所看到的。
block.FSM.changeState(new OnFire(block));
不错。我想的方法不一定是压缩编写逻辑的工作,而是在这里很好地实现这种逻辑的表示。我会把问题保留一两天,但这绝对是一个改进。谢谢。 – Ilya