【问题标题】:Java - Best method of handling toggleable effects in a gameJava - 在游戏中处理可切换效果的最佳方法
【发布时间】:2012-02-15 18:30:47
【问题描述】:

我正在开发一款游戏,用户可以在其中打开/关闭某些效果。这些影响会消耗用户的精力,程序的各个部分必须能够检查影响是否处于活动状态。目前,我正在使用枚举类型来存储和检查效果:

public static enum Effects { SUPER_FIRE, FIRE_SHIELD }

if (someEffect == Effects.SUPER_FIRE) {
    // Breath fire etc..
}

这么说,我必须为每个效果存储其他变量 - 例如使用它所需的级别或它消耗能量的速率。所以,我想到的另一种方法是使用一个类:

public class SuperFire extends Effect {

    public static int levelRequired = 10;
    public static int drainRate = 5;        

    public boolean active() {
        // Check if it's active
    }

    public boolean activate() {
    }

    public boolean deactivate() {
    }

}


SuperFireEffect sfe = new SuperFire();
sfe.activate();
if (sfe.active()) {
    energyLevel -= sfe.drainRate;
}
sfe.deactivate();

哪种实现(或任何其他)最适合这种情况?

【问题讨论】:

  • 使用类,面向对象允许您将逻辑放在类中并继承/覆盖它们,而不是在游戏代码中到处传播。
  • 请记住enums can have members and methods。如果你使用enums,像levelRequired 这样的“静态”属性可以存储在枚举中。 details about the implementation也可以。
  • 另外请记住,为了真正的灵活性,存储有关您的效果的信息,包括您可以使用自省来实例化的类名,可以存储在各种标记语言中,例如 XML 或 YAML。

标签: java class design-patterns


【解决方案1】:

无论如何,我都不愿说“最好”,但您的第二个例子似乎是“更灵活”这个词的意思中的“更好”。

当然,从你非常小的代码 sn-ps 来看,你并没有很好地封装功能,所以看起来你可能希望先做更多的设计工作。

最后,您希望游戏代码根据 Effect 基类及其能做什么来思考,而不必了解 SuperFireEffect 之类的实现。

【讨论】:

    【解决方案2】:

    我可能会选择第二个,因为我认为它更“面向对象”。另外,如果您开始添加大量效果,它将更易于维护,并且您可以从超级效果的继承中受益。

    【讨论】:

      【解决方案3】:

      第二个实现更好,因为您提到了使用自己的一组特性/属性/字段/属性指定的效果,例如 "levelRequired, drainRate"。因此,按照这种方法,您应该很好地定义您的类/实体及其特性和共同特征。应该传达面向对象的编程原则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多