gpt4 book ai didi

actionscript-3 - 游戏决策设计模式

转载 作者:行者123 更新时间:2023-12-04 04:27:29 25 4
gpt4 key购买 nike

所以我有很多物体的 Material ,每个物体都具有不同的特性(砖、玻璃等),并且每个物体都受到元素效果的不同影响。例如,砖 Material 受火或酸的影响与水泥 Material 不同。当应用另一个燃烧/熔化效果时,正在燃烧或熔化的砖块将受到不同的影响。

在我的游戏中,我有一个 FSM,但它非常简单。如果我将火元素放在砖上,它会进入燃烧状态。但是,如果我随后将水元素放在砖上,我可能希望火熄灭,获取/增加生命值并更改纹理(或不取决于当前的组合)。

关键是,我有很多组合,它们之间没有共同点,所以我无法创造出统一的东西。有时我需要改变纹理,有时我不需要。有时会受到伤害,而有时会增加健康。有时我只需要在函数中什么都不做。在这一点上,我唯一能做的就是创建一个全局映射,例如:

FunctionMap[ObjectMaterial][CurrentObjectState][ElementBeingApplied]

(IE。

FunctionMap[砖][燃烧][酸]
功能图[砖][熔化][酸]

)

问题是,由于 Material 和效果类型的可用组合数量,这显然是大量功能。谁能推荐一条路线或模式看?

虽然与讨论不完全相关,但这是在 AS3 和 Away3D 中进行的。

以下是我的一些类(class)示例:

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));

最佳答案

所以你的问题是你有 9 * 5 * 4 个效果组合,对吧?为每一个单独的功能管理起来并不有趣。但是,即使数据量很大,您也需要它。我会让这些数据尽可能简单,然后解析它。就像是:

var materialProperties = {
brick: {
fire: {
normal: {damage: 10, image: 'brick_fire.jpg'},
}
water: {
fire: {damage: 0, image: 'brick_smoking.jpg'}
}
},
//... a lot more of this ...
}

class Material
{
public var damage:int = 0;
public var image:String = '';

private var properties:Object;
private var state:String;

public function Material(properties)
{
this.properties = properties;
}

public function apply(effect:String):void
{
if(properties[effect])
{
if(properties[effect][state])
{
update(properties[effect][state]);
}
else if(properties[effect]['normal'])
{
update(properties[effect]['normal']);
}
}
state = effect;
}

private function update(properties):void
{
damage += properties.damage;
image = properties.image;
}
}

var brick = new Material(materialProperties.brick);
brick.apply('fire');
brick.apply('water');

关于actionscript-3 - 游戏决策设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7028877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com