Actionscript 3 博弈决策设计模式

Actionscript 3 博弈决策设计模式,actionscript-3,Actionscript 3,所以我有很多物体,每种材料都有不同的属性(砖、玻璃等),每个物体都受到元素效果的不同影响。例如,砖材料受火或酸的影响与水泥材料不同。当应用另一种燃烧/熔化效果时,正在燃烧或熔化的砖将受到不同的影响 在我的游戏中,我有一个FSM,但它非常简单。如果我把火元素扔到砖头上,它就会进入燃烧状态。但是,如果我在砖块上放置了一个水元素,我可能希望火熄灭,获取/添加生命值并更改纹理(或者不取决于当前的组合) 关键是,我有很多组合,它们之间没有共同点,所以我无法创建统一的东西。有时我需要改变纹理,有时我不需要。

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

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

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

FunctionMap[ObjectMaterial][CurrentObjectState][ElementBeingApplied]

(即

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

)

问题是,由于材料和效果类型的可用组合数量,这显然是一堆函数。有人能推荐一条路线或一种模式吗

虽然与讨论不完全相关,但这是在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;


    }
}
}

因此,一个fire元素可以应用于一组应用程序。其中一个块,当前冻结,现在命中,现在变为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');

+1这是何时应用封装的完美示例。让一个Brick类处理与该Brick相关的所有内容。让Bricks类处理所有的Brick对象。是的。我正在编辑上面的描述。但是,要创建的意大利面代码和大量函数的数量仍然很大。您正在忘记状态。如果您的Brick类保留状态“fire or whatever”,那么您所需要的只是类中每个状态的一个函数。然后,类可以决定要做什么。你真的很想变得圆滑,然后只需要一个名为statChange的函数或其他什么,然后在状态中传递。然后让类确定要更改为的状态。public var currentState:String;//火、水、冰、酸都可以做到,我也考虑过,但对我来说还是有点凌乱。你的意思是这样的:类Brick{function OnFire(){}}是的,我可以这样做,但是我仍然需要对我提到的条件进行一系列检查。如果这是我必须要做的,我想那没关系,但像任何人一样,我很好奇我是否能以更好的方式设计它。不错。我在想一种方法,不一定要把写逻辑的工作浓缩起来,而是这种逻辑的表示,在这里很好地实现了。我会再问一两天,但这肯定是一个进步。谢谢