所以我有許多物品都具有不同的屬性(磚,玻璃等),並且每種物品都受到元素效果的不同影響。例如磚塊材料會受到火或酸的影響,而不是水泥材料。當應用另一個燃燒/熔化效果時,正在燃燒或融化的磚塊將受到不同的影響。遊戲決策設計模式
在我的遊戲中,我有一個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