具有多种效果/特征的能力对象(游戏)

时间:2014-09-27 10:05:10

标签: java oop design-patterns enums

我正努力在我的游戏中创建一个代表冠军能力的课程。我遇到的障碍是我不知道如何设计一个具有多种属性的Ability类,即破坏性,眩晕,减速。我的想法是创建表示所有这些属性的枚举类,然后将它们分配给我的能力,例如:

public enum Effect {
    DAMAGE,
    SLOW,
    STUN,
    ... 
}

但是,如果我有能力同时眩晕并造成伤害怎么办?我应该创建一个Effect []数组并以某种方式处理它,还是应该创建像Serializable这样的接口标记(这是我曾经有过的最狡猾的想法)?或者也许有类似案例的技术?

2 个答案:

答案 0 :(得分:1)

具有Effect个对象的数组似乎很好,列表会更好。您甚至可以创建自己的包装类,以提供基于应用效果计算实体属性的其他方法。

例如:

public class Effects
{
    public int calculateDamage(int baseDamage)
    {
        int damage = baseDamage;

        if (effects.contains(Effect.DAMAGE)) {
                            // some effect stacking :)
            damage *= 1.5 * Collections.frequency(effects, Effect.DAMAGE);
        }

        if (effects.contains(Effect.STUN)) {
            damage = 0;
        }

        return damage;
    }

    private final List<Effect> effects = new ArrayList<>();
}

Collections.frequency()是来自Apache Commons library的实用工具方法,我强烈推荐。

答案 1 :(得分:-1)

你可以创建一个类型为Effect的类,所有属性都作为布尔属性,然后根据需要为它们分配true或false,如果你想将属性扩展为那些你无法在编译时决定考虑的属性在Effect类

中放置一个HashMap类型的hashmap