修改类的属性

时间:2009-08-12 01:44:13

标签: c#

找到一个合适的问题标题和这个问题的标签让我很难接受。

基本上我已经建立了一个游戏,其中将出现几个单位/小怪。现在我对构建系统很感兴趣,因此每个单元都可以应用效果/增益/减益效果来修改单元的属性。这种效果的例子可能是霜效应,它会降低装置的移动速度,促进健康等等。计划是通过脚本实现这些效果,因此可以创建自定义用户效果。

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

问题在于,它不允许累积百分比的不同方式。比如,如果100等于120或121,则应该增加10%10%。

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

4 个答案:

答案 0 :(得分:5)

您正在使用Effect类进入正确的轨道。但是要保留每个单元的效果列表,而不是将效果引用到单位。如果要获取属性值,请查询所需的属性值,而不是使用apply()和unapply()函数来修改基值(这可能导致基础值因浮点错误而漂移等等)。

您的Effect类可以有一个方法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

如果您有这么多效果,这会变得效率低下,请在每次添加或删除效果时缓存这些值并重新计算它们。

答案 1 :(得分:3)

您是否考虑过Decorator模式?可以在此tutorial中找到一个实例。

我写了一个小例子来说明你的具体情况。类 UnitWithPowerUp 接受 Unit 对象(可能已经或可能尚未对其进行修饰)。当你在这个类上调用Health()时,它会获得 Unit 的运行状况,并将默认值增加10%。如果你装饰了两次,它将返回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的副本。

答案 2 :(得分:0)

如果您计划编写脚本以执行某些效果(对于具有大量效果的游戏可能会很好),您可以继续利用C#在运行时编译的能力Reference 。从本质上讲,您可以在C#中编写所需的所有内容,将字节代码保存在某处(可能作为级别文件或扩展包或其他内容的一部分),然后在每次关闭时执行相应的C#代码。

答案 3 :(得分:0)

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

到目前为止,我见过的有关此主题的最佳文章是

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