代码之家  ›  专栏  ›  技术社区  ›  Kasper Holdum

类的修改属性

c#
  •  3
  • Kasper Holdum  · 技术社区  · 16 年前

    为这个问题找到一个合适的题目和标签让我感到相当困难。

    基本上,我已经建立了一个游戏,其中会有几个单位/黑帮。现在我对构建一个系统很感兴趣,所以每个单元都可以应用效果/缓冲/去缓冲来修改单元的属性。这种影响的例子可能是霜冻效应,它会减慢单位的移动速度,促进健康等等。计划是通过脚本实现这些效果,这样就可以创建自定义的用户效果。

    我正在寻找如何实现这一点的建议。目前我已经考虑过创建一个效果类。然后,每个应用的效果都将是该类的一个实例,并且将引用它应用到的单元。这种效果至少有两种方法:分别应用和不应用的方法。

    问题在于,它不允许使用不同的累计百分比方法。比如,在100等于120或121的值上,应该增加两倍10%。

    不是很重要,但它是用C编码的#

    4 回复  |  直到 16 年前
        1
  •  5
  •   Kylotan    16 年前

    你的效果课走对了。但是,在每个单位上保留一个效果列表,而不是有效果指的是单位。当您想要获得一个属性值时,查询您需要的属性值,而不是使用apply()和unapply()函数来修改基值(这可能导致由于浮点错误等导致基础值漂移)。

    您的效果类可以有一个方法modify(),它将输入值作为浮点值,并返回修改后的值。查询一个属性最终看起来像这个伪代码:

    def get_movement_speed():
        value = base_movement_speed() # this is intrinsic to the unit
        for effect in movement_speed_effects_list:
            value = effect.modify(value)
        return value
    

    在不太可能发生的情况下,如果您有太多的效果导致效率低下,请缓存这些值,并在每次添加或删除效果时重新计算这些值。

        2
  •  3
  •   Charlie Salts    16 年前

    你考虑过 Decorator 模式?在这里可以找到一个实际的例子 tutorial .

    我写了一个小例子来说明你的具体情况。班级 加力单位 接受一 单位 对象(可能已装饰或尚未装饰)。当您对此类调用health()时,它将获取 单位 ,并将10%添加到默认100。如果你把它装饰了两次,它会退121。在单个修饰的上调用getDescription()。 单位 返回“Unit+Power up”。同样的,双装饰 单位 返回“Unit+Power up+Power up”。

        public abstract class Unit
        {
    
          public virtual string GetDescription()
          {
             return "Unit";
          }
    
          public virtual double Cost()
          {
             return 100;
          }
       }
    
       public abstract class EffectDecorator : Unit
       {
          public EffectDecorator()
          {
          }
       }
    
    
    
       public class UnitWithPowerUp : EffectDecorator
       {
          Unit unit;
    
          public UnitWithPowerUp(Unit unit)
          {
             this.unit = unit;
          }
    
          public override string GetDescription()
          {
             return unit.GetDescription() + " + Power Up";
          }
    
          public override double Health()
          {
             return unit.Health() * 1.10;
          }
       }
    

    我没有测试代码或任何东西,只是为了展示这个概念。我建议你拿一份 Head First Design Patterns 如果你认为这是有用的。

        3
  •  0
  •   Eli    16 年前

    如果你计划用脚本来做一些效果(这对有很多效果的游戏来说是很好的),你可以继续利用C在运行时编译的能力。 Reference .基本上,您可以在C中编写您想要的所有代码,将字节代码保存在某个地方(可能是级别文件或扩展包的一部分或其他),然后在每次代码关闭时执行相应的C代码。

        4
  •  0
  •   Mikeon    16 年前

    在进行需要动态更改对象状态的游戏时,请看一下组件系统/实体系统设计。

    到目前为止,我所看到的关于这个主题的最好的文章是

    http://www.devmaster.net/articles/oo-game-design/