2014-09-27 40 views
0

我试图使代表一个冠军在我的游戏能力的类。我面临的障碍是我不知道如何设计具有多种属性的Ability类,即损害,震惊,放缓。我的想法是建立代表所有这些特性枚举类,然后将其分配给我的能力,例如:能力对象具多重功效/功能(游戏)

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

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

+2

http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html – phs 2014-09-27 10:16:41

回答

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一个实用方法,该方法我强烈建议。

+0

我没有这样想的吧)这是一个有趣的决定,非常感谢!) – Zarial 2014-09-27 11:23:57

+0

现在我想的也许不是创建枚举更好的解决方案,这将是为每个类型Effect创建类,因为能力的每个实例职业将自己的属性包装为伤害,减速,眩晕+伤害或者缓慢+伤害。所以现在我认为我应该创建抽象类效果与它的孩子,如伤害,眩晕,慢等。每个能力实例将包含一个效果列表和包装,你建议,将是唯一的方式来与效果交互,你是什么想一想? – Zarial 2014-09-27 11:45:17

+0

听起来对我很好:) – wassup 2014-09-27 11:50:29

-1

你可以与所有的属性创建一个类类型Effect布尔属性,然后只要你喜欢指定真或假的他们,如果你想扩展属性的人,你不能在编译时决定考虑把在Effect类类型的HashMap的一个HashMap的

+0

在我的类层次结构中,我有抽象能力 - >抽象MagicAbility-> Firebolt这是一个实现。火焰箭有两个效果:'Effect.DAMAGE'和'Effect.DOT'(随时间的伤害)。 Firebolt类的影响在编译时已知。正如@phs所说,我已经使用'EnumSet '将这些效果设置到'Ability'类中的EnumSet中。这个类的所有其他孩子只是通过'超(EnumSet )通过EnumSet值;'在我的火弩箭类,它看起来像'超(EnumSet.of(Effect.DAMAGE,Effect.DOT));'我只想知道有更优雅的方式来做到这一点?Mby通过注释? – Zarial 2014-09-27 11:08:28