2014-09-27 67 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