游戏中精灵对象的属性功能设计

来源:互联网 发布:js图片自动滚动代码 编辑:程序博客网 时间:2024/05/29 04:59
我们大部分it人事可能都玩过游戏,且不止一款游戏,都知道游戏有属性;

在游戏中,包含哪些属性,时候数值策划而定;

属性牵涉三个大问题,

1,属性不管是前期还是后期变更可能会非常大;

2,存在不同的属性系统,比如人物基础属性,坐骑属性,宠物属性等;

3,属性计算;属性最终计算;

 

第一条和第二条,是非常息息相关的功能块设计;需要做到统一,方便,且可扩展性设计;

有且是对策划在配置各种属性,各种系统中去配置属性,既要他们方便配置,思路清晰,又要方便程序扩展,转化;

  1 package com.game.engine.struct;  2   3 import java.io.Serializable;  4   5 /**  6  * 基础属性结果  7  *  8  * <br>  9  * author 失足程序员<br> 10  * mail 492794628@qq.com<br> 11  * phone 13882122019<br> 12  */ 13 public class BaseAbility implements Serializable { 14  15     private static final long serialVersionUID = 7331996190994084714L; 16     /** 17      * 攻击速度 18      */ 19     private int attackSpeed; 20     /** 21      * 力量,1001 22      */ 23     private int strength; 24     /** 25      * 主动,1002 26      */ 27     private int initiative; 28     /** 29      * 智慧,1003 30      */ 31     private int intelligence; 32     /** 33      * 意志,1004 34      */ 35     private int willpower; 36     /** 37      * 体魄,1005 38      */ 39     private int wounds; 40     //物理攻击下限 41     private int dcmin; 42     //物理攻击上限 43     private int dcmax; 44     //魔法攻击下限 45     private int mcmin; 46     //魔法攻击上限 47     private int mcmax; 48     //物理防御 49     private int ac; 50     //魔法防御 51     private int mac; 52     //闪避 53     private int duck; 54     //命中率 55     private int hit; 56     //韧性 57     private int toughness; 58     //暴击值(概率) 59     private int critValuePer; 60     //暴击值 61     private int critvalue; 62     //自动回血 63     private int autohp; 64     //战斗中回复 65     private int auto_battle_hp; 66     //自动回魔法值 67     private int automp; 68     //战斗中回复 69     private int auto_battle_mp; 70     //最大血量 71     private int hpmax; 72     //最大魔法 73     private int mpmax; 74     //升级的最大经验值 75     private long expmax; 76     //速度 77     private int speed; 78     //物理减伤 79     private int dcharmdel; 80     //魔法减伤 81     private int mcharmdel; 82     //物理反伤 83     private int undcharmdel; 84     //魔法反伤 85     private int unmcharmdel; 86     //吸血属性 87     private int drains; 88  89     //--------------上面需要传到前端,下面不需要----------------// 90     //经验加成 91     private int expmultiple; 92  93     //属性提供的战斗力 94     private int fight; 95  96     public BaseAbility() { 97     } 98  99     public int getAttackSpeed() {100         return attackSpeed;101     }102 103     public void setAttackSpeed(int attackSpeed) {104         this.attackSpeed = attackSpeed;105     }106 107     public int getStrength() {108         return strength;109     }110 111     public void setStrength(int strength) {112         this.strength = strength;113     }114 115     public int getInitiative() {116         return initiative;117     }118 119     public void setInitiative(int initiative) {120         this.initiative = initiative;121     }122 123     public int getIntelligence() {124         return intelligence;125     }126 127     public void setIntelligence(int intelligence) {128         this.intelligence = intelligence;129     }130 131     public int getWillpower() {132         return willpower;133     }134 135     public void setWillpower(int willpower) {136         this.willpower = willpower;137     }138 139     public int getWounds() {140         return wounds;141     }142 143     public void setWounds(int wounds) {144         this.wounds = wounds;145     }146 147     public int getDcmin() {148         return dcmin;149     }150 151     public void setDcmin(int dcmin) {152         this.dcmin = dcmin;153     }154 155     public int getDcmax() {156         return dcmax;157     }158 159     public void setDcmax(int dcmax) {160         this.dcmax = dcmax;161     }162 163     public int getMcmin() {164         return mcmin;165     }166 167     public void setMcmin(int mcmin) {168         this.mcmin = mcmin;169     }170 171     public int getMcmax() {172         return mcmax;173     }174 175     public void setMcmax(int mcmax) {176         this.mcmax = mcmax;177     }178 179     public int getAc() {180         return ac;181     }182 183     public void setAc(int ac) {184         this.ac = ac;185     }186 187     public int getMac() {188         return mac;189     }190 191     public void setMac(int mac) {192         this.mac = mac;193     }194 195     public int getDuck() {196         return duck;197     }198 199     public void setDuck(int duck) {200         this.duck = duck;201     }202 203     public int getHit() {204         return hit;205     }206 207     public void setHit(int hit) {208         this.hit = hit;209     }210 211     public int getToughness() {212         return toughness;213     }214 215     public void setToughness(int toughness) {216         this.toughness = toughness;217     }218 219     public int getCritValuePer() {220         return critValuePer;221     }222 223     public void setCritValuePer(int critValuePer) {224         this.critValuePer = critValuePer;225     }226 227     public int getCritvalue() {228         return critvalue;229     }230 231     public void setCritvalue(int critvalue) {232         this.critvalue = critvalue;233     }234 235     public int getAutohp() {236         return autohp;237     }238 239     public void setAutohp(int autohp) {240         this.autohp = autohp;241     }242 243     public int getAuto_battle_hp() {244         return auto_battle_hp;245     }246 247     public void setAuto_battle_hp(int auto_battle_hp) {248         this.auto_battle_hp = auto_battle_hp;249     }250 251     public int getAutomp() {252         return automp;253     }254 255     public void setAutomp(int automp) {256         this.automp = automp;257     }258 259     public int getAuto_battle_mp() {260         return auto_battle_mp;261     }262 263     public void setAuto_battle_mp(int auto_battle_mp) {264         this.auto_battle_mp = auto_battle_mp;265     }266 267     public int getHpmax() {268         return hpmax;269     }270 271     public void setHpmax(int hpmax) {272         this.hpmax = hpmax;273     }274 275     public int getMpmax() {276         return mpmax;277     }278 279     public void setMpmax(int mpmax) {280         this.mpmax = mpmax;281     }282 283     public long getExpmax() {284         return expmax;285     }286 287     public void setExpmax(long expmax) {288         this.expmax = expmax;289     }290 291     public int getSpeed() {292         return speed;293     }294 295     public void setSpeed(int speed) {296         this.speed = speed;297     }298 299     public int getDcharmdel() {300         return dcharmdel;301     }302 303     public void setDcharmdel(int dcharmdel) {304         this.dcharmdel = dcharmdel;305     }306 307     public int getMcharmdel() {308         return mcharmdel;309     }310 311     public void setMcharmdel(int mcharmdel) {312         this.mcharmdel = mcharmdel;313     }314 315     public int getUndcharmdel() {316         return undcharmdel;317     }318 319     public void setUndcharmdel(int undcharmdel) {320         this.undcharmdel = undcharmdel;321     }322 323     public int getUnmcharmdel() {324         return unmcharmdel;325     }326 327     public void setUnmcharmdel(int unmcharmdel) {328         this.unmcharmdel = unmcharmdel;329     }330 331     public int getDrains() {332         return drains;333     }334 335     public void setDrains(int drains) {336         this.drains = drains;337     }338 339     public int getExpmultiple() {340         return expmultiple;341     }342 343     public void setExpmultiple(int expmultiple) {344         this.expmultiple = expmultiple;345     }346 347     public int getFight() {348         return fight;349     }350 351     public void setFight(int fight) {352         this.fight = fight;353     }354 355     /**356      * 属性清零357      *358      */359     public void clearZero() {360         this.strength = 0;361         /**362          * 主动,1002363          */364         this.initiative = 0;365         /**366          * 智慧,1003367          */368         this.intelligence = 0;369         /**370          * 意志,1004371          */372         this.willpower = 0;373         /**374          * 体魄,1005375          */376         this.wounds = 0;377         this.attackSpeed = 0;378         this.dcmin = 0;379         this.dcmax = 0;380         this.mcmin = 0;381         this.mcmax = 0;382         this.ac = 0;383         this.mac = 0;384         this.duck = 0;385         this.hit = 0;386         this.toughness = 0;387         this.critvalue = 0;388         this.critValuePer = 0;389         this.autohp = 0;390         this.auto_battle_hp = 0;391         this.automp = 0;392         this.auto_battle_mp = 0;393         this.hpmax = 0;394         this.mpmax = 0;395         this.expmax = 0;396         this.speed = 0;397         this.dcharmdel = 0;398         this.undcharmdel = 0;399         this.mcharmdel = 0;400         this.unmcharmdel = 0;401         this.expmultiple = 0;402         this.drains = 0;403         this.fight = 0;404     }405 406     /**407      * 属性小于0的处理408      */409     public void zeroAbility() {410         this.strength = this.strength > 0 ? this.strength : 0;411         /**412          * 主动,1002413          */414         this.initiative = this.initiative > 0 ? this.initiative : 0;415         /**416          * 智慧,1003417          */418         this.intelligence = this.intelligence > 0 ? this.intelligence : 0;419         /**420          * 意志,1004421          */422         this.willpower = this.willpower > 0 ? this.willpower : 0;423         /**424          * 体魄,1005425          */426         this.wounds = this.wounds > 0 ? this.wounds : 0;427         this.attackSpeed = this.attackSpeed > 0 ? this.attackSpeed : 0;428         this.dcmin = this.dcmin > 0 ? this.dcmin : 0;429         this.dcmax = this.dcmax > 0 ? this.dcmax : 0;430         this.mcmin = this.mcmin > 0 ? this.mcmin : 0;431         this.mcmax = this.mcmax > 0 ? this.mcmax : 0;432         this.ac = this.ac > 0 ? this.ac : 0;433         this.mac = this.mac > 0 ? this.mac : 0;434         this.duck = this.duck > 0 ? this.duck : 0;435         this.hit = this.hit > 0 ? this.hit : 0;436         this.toughness = this.toughness > 0 ? this.toughness : 0;437         this.critvalue = this.critvalue > 0 ? this.critvalue : 0;438         this.critValuePer = this.critValuePer > 0 ? this.critValuePer : 0;439         this.autohp = this.autohp > 0 ? this.autohp : 0;440         this.auto_battle_hp = this.auto_battle_hp > 0 ? this.auto_battle_hp : 0;441         this.automp = this.automp > 0 ? this.automp : 0;442         this.auto_battle_mp = this.auto_battle_mp > 0 ? this.auto_battle_mp : 0;443         this.hpmax = this.hpmax > 0 ? this.hpmax : 0;444         this.mpmax = this.mpmax > 0 ? this.mpmax : 0;445         this.expmax = this.expmax > 0 ? this.expmax : 0;446         this.speed = this.speed < 0 ? 0 : (this.speed > 8000 ? 8000 : this.speed); // 移动速度介于 0 -8000447         this.dcharmdel = this.dcharmdel > 0 ? this.dcharmdel : 0;448         this.undcharmdel = this.undcharmdel > 0 ? this.undcharmdel : 0;449         this.mcharmdel = this.mcharmdel > 0 ? this.mcharmdel : 0;450         this.unmcharmdel = this.unmcharmdel > 0 ? this.unmcharmdel : 0;451         this.expmultiple = this.expmultiple > 0 ? this.expmultiple : 0;452         this.drains = this.drains > 0 ? this.drains : 0;453     }454 455     @Override456     public String toString() {457         return "BaseAbility{" + "attackSpeed=" + attackSpeed + ", strength=" + strength + ", initiative=" + initiative + ", intelligence=" + intelligence + ", willpower=" + willpower + ", wounds=" + wounds + ", dcmin=" + dcmin + ", dcmax=" + dcmax + ", mcmin=" + mcmin + ", mcmax=" + mcmax + ", ac=" + ac + ", mac=" + mac + ", duck=" + duck + ", hit=" + hit + ", toughness=" + toughness + ", crit=" + critValuePer + ", critvalue=" + critvalue + ", autohp=" + autohp + ", auto_battle_hp=" + auto_battle_hp + ", automp=" + automp + ", auto_battle_mp=" + auto_battle_mp + ", hpmax=" + hpmax + ", mpmax=" + mpmax + ", expmax=" + expmax + ", speed=" + speed + ", dcharmdel=" + dcharmdel + ", mcharmdel=" + mcharmdel + ", undcharmdel=" + undcharmdel + ", unmcharmdel=" + unmcharmdel + ", drains=" + drains + ", expmultiple=" + expmultiple + ", fight=" + fight + '}';458     }459 460 }

这个类是用于服务器程序计算的,

  1 package com.game.engine.struct;  2   3 import com.game.engine.struct.PersonAttribute.AttKey;  4 import java.util.concurrent.ConcurrentHashMap;  5 import net.sz.engine.utils.RandomUtils;  6 import org.apache.log4j.Logger;  7   8 /**  9  * 属性 10  * <br> 11  * author 失足程序员<br> 12  * mail 492794628@qq.com<br> 13  * phone 13882122019<br> 14  */ 15 public class PersonAttribute extends ConcurrentHashMap<AttKey, Integer> { 16  17     private static final Logger log = Logger.getLogger(PersonAttribute.class); 18  19     private static final long serialVersionUID = -3258690074056212218L; 20     private Long expMax = 0l; 21  22     public enum AttKey { 23  24         /** 25          * 120, "最大开孔数" 26          */ 27         EGAP_KONGMAX(120, "最大开孔数"), 28         /** 29          * 121, "当前开孔数" 30          */ 31         EGAP_KONG(121, "当前开孔数"), 32         /** 33          * 122, "孔1" 34          */ 35         EGAP_KONG_1(122, "孔1"), 36         /** 37          * 123, "孔2" 38          */ 39         EGAP_KONG_2(123, "孔2"), 40         /** 41          * 124, "孔3" 42          */ 43         EGAP_KONG_3(124, "孔3"), 44         /** 45          * 125, "孔4" 46          */ 47         EGAP_KONG_4(125, "孔4"), 48         /** 49          * 126, "孔5" 50          */ 51         EGAP_KONG_5(126, "孔5"), 52         /** 53          * 144, "精炼消耗" 54          */ 55         REFINE_Star_Cost(144, "精炼消耗"), 56         /** 57          * 力量,1001 58          */ 59         Strength(1001, "力量"), 60         /** 61          * 主动,1002 62          */ 63         Initiative(1002, "主动"), 64         /** 65          * 智慧,1003 66          */ 67         Intelligence(1003, "智慧"), 68         /** 69          * 意志,1004 70          */ 71         Willpower(1004, "意志"), 72         /** 73          * 体魄,1005 74          */ 75         Wounds(1005, "体魄"), 76         /** 77          * 物理攻击下限,2001 78          */ 79         DCmin(2001, "物理攻击下限"), 80         /** 81          * 物理攻击上限,2002 82          */ 83         DCmax(2002, "物理攻击上限"), 84         /** 85          * 物理攻击增加,2003 86          */ 87         DCcount(2003, "物理攻击增加"), 88         /** 89          * 物理攻击万分比提升,2004 90          */ 91         DCper(2004, "物理攻击万分比提升"), 92         /** 93          * 魔法攻击下限,2011 94          */ 95         MCmin(2011, "魔法攻击下限"), 96         /** 97          * 魔法攻击上限,2012 98          */ 99         MCmax(2012, "魔法攻击上限"),100         /**101          * 魔法攻击增加,2013102          */103         MCcount(2013, "魔法攻击增加"),104         /**105          * 魔法攻击万分比提升,2014106          */107         MCper(2014, "魔法攻击万分比提升"),108         /**109          * 物理防御上限,2021110          */111         AC(2021, "物理防御"),112         /**113          * 物防增加,2023114          */115         ACCount(2023, "物防增加"),116         /**117          * 物理防御万分比提升,2024118          */119         ACPer(2024, "物理防御万分比提升"),120         /**121          * 魔法防御上限,2031122          */123         Mac(2031, "魔法防御"),124         /**125          * 魔防增加,2033126          */127         MacCount(2033, "魔防增加"),128         /**129          * 魔法防御万分比提升,2034130          */131         MacPer(2034, "魔法防御万分比提升"),132         /**133          * 最大魔法,2041134          */135         MpMax(2041, "最大魔法"),136         /**137          * 最大魔法万分比提升,2042138          */139         MPMaxper(2042, "最大魔法万分比提升"),140         /**141          * 当前魔法回复(战斗状态),2043142          */143         MPFightCount(2043, "当前魔法回复(战斗状态)"),144         /**145          * 当前魔法回复(非战斗状态),2044146          */147         MPCount(2044, "当前魔法回复(非战斗状态)"),148         /**149          * 当前魔法值回复万分比,2045150          */151         MPPer(2045, "当前魔法值回复万分比"),152         /**153          * 当前魔法值,2046154          */155         MP(2047, "当前魔法值"),156         /**157          * 自动回复生命,2058158          */159         AutoMP(2048, "自动回复魔法值"),160         /**161          * 战斗状态自动回复魔法值,2049162          */163         AutoBattleMP(2049, "战斗状态自动回复魔法值"),164         /**165          * 最大血量,2051166          */167         HPMax(2051, "最大血量"),168         /**169          * 最大血量万分比提升,2052170          */171         HPMaxper(2052, "最大血量万分比提升"),172         /**173          * 当前生命回复(战斗状态),2053174          */175         HPFightCount(2053, "当前生命回复(战斗状态)"),176         /**177          * 当前生命回复(非战斗状态),2054178          */179         HPCount(2054, "当前生命回复(非战斗状态)"),180         /**181          * 当前生命回复万分比,2055182          */183         HPPer(2055, "当前生命回复万分比"),184         /**185          * 当前生命,2057186          */187         HP(2057, "当前生命"),188         /**189          * 自动回复生命,2058190          */191         AutoHP(2058, "自动回复生命"),192         /**193          * 战斗状态自动回复生命,2059194          */195         AutoBattleHP(2059, "战斗状态自动回复生命"),196         /**197          * 闪避,2061198          */199         Dcuk(2061, "闪避"),200         /**201          * 韧性,2071202          */203         Toughness(2071, "韧性"),204         /**205          * 命中准确,2081206          */207         Hit(2081, "命中准确"),208         /**209          * 暴击,2091210          */211         CritValue(2091, "暴击"),212         /**213          * 物理伤害减免,2101214          */215         DCharmdel(2101, "物理伤害减免"),216         /**217          * 魔法减伤,2111218          */219         MCharmdel(2111, "魔法减伤"),220         /**221          * 物理反伤,2121222          */223         UnDCharmdel(2121, "物理反伤"),224         /**225          * 魔法反伤,2131226          */227         UnMCharmdel(2131, "魔法反伤"),228         /**229          * 暴击伤害加成的倍率,2141230          */231         CritValuePer(2141, "暴击伤害加成的倍率"),232         /**233          * 2151, "升级所需经验值"234          */235         //        ExpMax(2151, "升级所需经验值"),236         /**237          * 当前经验值,2152238          */239         Exp(2152, "获得经验值"),240         /**241          * 经验加成(万分比),2153242          */243         ExpPer(2153, "经验加成(万分比)"),244         /**245          * 经验加成(固定点数),2154246          */247         ExpCount(2154, "经验加成(固定点数)"),248         /**249          * 移动速度,2161250          */251         Speed(2161, "移动速度"),252         /**253          * 移动速度加成(万分比),2162254          */255         SpeedPer(2162, "移动速度加成(万分比)"),256         /**257          * 移动速度加成(点数),2163258          */259         SpeedCount(2163, "移动速度加成(点数)"),260         /**261          * 攻击速度262          */263         AttackSpeed(2171, "攻击速度"),264         /**265          * 3001, "反伤盾所用的根据攻击力计算,根据不同的职业用不同的攻击力"266          */267         AttackPower(3001, "反伤盾所用的根据攻击力计算,根据不同的职业用不同的攻击力"),268         /**269          * 9993, "赠送道具"270          */271         Goods(9993, "赠送道具"),272         /**273          * 9994,魔法和生命值都加274          */275         HPMP(9994, "魔法和生命值都加"),276         /**277          * 9995,魔法和生命值都加,百分比278          */279         HPMPPer(9995, "魔法和生命值都加,百分比"),280         /**281          * 9996, vip经验282          */283         VIPExp(9996, "vip经验"),284         /**285          * 9997, "buff效果"286          */287         BuffState(9997, "buff效果"),288         /**289          * 9998, "脚本执行"290          */291         SCRIPT(9998, "脚本执行"),292         /**293          * 战斗力,9999294          */295         Fight(9999, "战斗力");296 297         private int key;298         private String value;299 300         private AttKey(int key, String value) {301             this.key = key;302             this.value = value;303         }304 305         /**306          * 根据索引获取key307          *308          * @param key309          * @return310          */311         public static AttKey parse(int key) {312             AttKey[] values = AttKey.values();313             for (AttKey value : values) {314                 if (value.getKey() == key) {315                     return value;316                 }317             }318             return null;319         }320 321         /**322          *323          * @param key324          * @return325          */326         public static AttKey parse(String key) {327             return Enum.valueOf(AttKey.class, key);328         }329 330         /**331          * 键值332          *333          * @return334          */335         public int getKey() {336             return key;337         }338 339         /**340          * 描述字符341          *342          * @return343          */344         public String getValue() {345             return value;346         }347 348     }349 350     @Override351     public Integer put(AttKey key, Integer value) {352         return super.put(key, value); //To change body of generated methods, choose Tools | Templates.353     }354 355     /**356      * 重写,如果没有建会返回0而不是null357      *358      * @param key359      * @return360      */361     @Override362     public Integer get(Object key) {363         Integer value = super.get(key);364         if (value != null) {365             return value;366         }367         return 0;368     }369 370     /**371      * 仅限buff计算调用372      * <br>373      * 慎重调用374      *375      * @param job 职业编号376      * @param baseAbility377      * @param attKey378      */379     @Deprecated380     public static int getBuffAbility(int job, BaseAbility baseAbility, AttKey attKey) {381         int value = 0;382         switch (attKey) {383             case AttackPower: //384             {385                 switch (job) {386                     //物理系列387                     case 1://骑士388                     case 3://射手389                     case 5://屠杀者390                         value = RandomUtils.random(baseAbility.getDcmin(), baseAbility.getDcmax());391                         break;392                     //魔法系列393                     case 2://法师394                     case 4://刺客395                         value = RandomUtils.random(baseAbility.getMcmin(), baseAbility.getMcmax());396                         break;397                 }398             }399             break;400             case AC:401             case ACCount:402                 value = baseAbility.getAc();403                 break;404             case AttackSpeed:405                 value = baseAbility.getAttackSpeed();406                 break;407             case AutoBattleHP:408                 value = baseAbility.getAuto_battle_hp();409                 break;410             case AutoBattleMP:411                 value = baseAbility.getAuto_battle_mp();412                 break;413             case AutoHP:414                 value = baseAbility.getAutohp();415                 break;416             case AutoMP:417                 value = baseAbility.getAutomp();418                 break;419             case CritValue:420                 value = baseAbility.getCritvalue();421                 break;422             case CritValuePer:423                 value = baseAbility.getCritValuePer();424                 break;425             case DCharmdel:426                 value = baseAbility.getDcharmdel();427                 break;428             case DCmin:429             case DCmax:430                 value = RandomUtils.random(baseAbility.getDcmin(), baseAbility.getDcmax());431                 break;432             case Dcuk:433                 value = baseAbility.getDuck();434                 break;435             case Fight:436                 value = baseAbility.getFight();437                 break;438             case HPMax:439                 value = baseAbility.getHpmax();440                 break;441             case Hit:442                 value = baseAbility.getHit();443                 break;444             case Initiative:445                 value = baseAbility.getInitiative();446                 break;447             case Intelligence:448                 value = baseAbility.getIntelligence();449                 break;450             case MCharmdel:451                 value = baseAbility.getMcharmdel();452                 break;453             case MCmax:454             case MCmin:455                 value = RandomUtils.random(baseAbility.getMcmin(), baseAbility.getMcmax());456                 break;457             case Mac:458             case MacCount:459                 value = baseAbility.getMac();460                 break;461             case MpMax:462                 value = baseAbility.getMpmax();463                 break;464             case Strength:465                 value = baseAbility.getStrength();466                 break;467             case Speed:468             case SpeedCount:469                 value = baseAbility.getSpeed();470                 break;471             case Toughness:472                 value = baseAbility.getToughness();473                 break;474             case UnDCharmdel:475                 value = baseAbility.getUndcharmdel();476                 break;477             case UnMCharmdel:478                 value = baseAbility.getUnmcharmdel();479                 break;480             case Willpower:481                 value = baseAbility.getWillpower();482                 break;483             case Wounds:484                 value = baseAbility.getWounds();485                 break;486         }487         return value;488     }489 490     /**491      * 构建属性492      * <br>493      * 慎重调用494      *495      * @param baseAbility496      */497     @Deprecated498     public void buildBaseAbility(BaseAbility baseAbility) {499         baseAbility.setExpmax(baseAbility.getExpmax() + this.getExpMax());500         for (Entry<AttKey, Integer> entry : this.entrySet()) {501             AttKey key = entry.getKey();502             Integer value = entry.getValue();503             switch (key) {504                 case AC:505                 case ACCount:506                     baseAbility.setAc(baseAbility.getAc() + value);507                     break;508                 case AttackSpeed:509                     baseAbility.setAttackSpeed(baseAbility.getAttackSpeed() + value);510                     break;511                 case AutoBattleHP:512                     baseAbility.setAuto_battle_hp(baseAbility.getAuto_battle_hp() + value);513                     break;514                 case AutoBattleMP:515                     baseAbility.setAuto_battle_mp(baseAbility.getAuto_battle_mp() + value);516                     break;517                 case AutoHP:518                     baseAbility.setAutohp(baseAbility.getAutohp() + value);519                     break;520                 case AutoMP:521                     baseAbility.setAutomp(baseAbility.getAutomp() + value);522                     break;523                 case CritValue:524                     baseAbility.setCritvalue(baseAbility.getCritvalue() + value);525                     break;526                 case CritValuePer:527                     baseAbility.setCritValuePer(baseAbility.getCritValuePer() + value);528                     break;529                 case DCcount:530                     baseAbility.setDcmin(baseAbility.getDcmin() + value);531                     baseAbility.setDcmax(baseAbility.getDcmax() + value);532                     break;533                 case DCharmdel:534                     baseAbility.setDcharmdel(baseAbility.getDcharmdel() + value);535                     break;536                 case DCmax:537                     baseAbility.setDcmax(baseAbility.getDcmax() + value);538                     break;539                 case DCmin:540                     baseAbility.setDcmin(baseAbility.getDcmin() + value);541                     break;542                 case Dcuk:543                     baseAbility.setDuck(baseAbility.getDuck() + value);544                     break;545                 case Fight:546                     baseAbility.setFight(baseAbility.getFight() + value);547                     break;548                 case HPMax:549                     baseAbility.setHpmax(baseAbility.getHpmax() + value);550                     break;551                 case Hit:552                     baseAbility.setHit(baseAbility.getHit() + value);553                     break;554                 case Initiative:555                     baseAbility.setInitiative(baseAbility.getInitiative() + value);556                     break;557                 case Intelligence:558                     baseAbility.setIntelligence(baseAbility.getIntelligence() + value);559                     break;560                 case MCcount:561                     baseAbility.setMcmin(baseAbility.getMcmin() + value);562                     baseAbility.setMcmax(baseAbility.getMcmax() + value);563                     break;564                 case MCharmdel:565                     baseAbility.setMcharmdel(baseAbility.getMcharmdel() + value);566                     break;567                 case MCmax:568                     baseAbility.setMcmax(baseAbility.getMcmax() + value);569                     break;570                 case MCmin:571                     baseAbility.setMcmin(baseAbility.getMcmin() + value);572                     break;573                 case Mac:574                 case MacCount:575                     baseAbility.setMac(baseAbility.getMac() + value);576                     break;577                 case MpMax:578                     baseAbility.setMpmax(baseAbility.getMpmax() + value);579                     break;580                 case Strength:581                     baseAbility.setStrength(baseAbility.getStrength() + value);582                     break;583                 case Speed:584                 case SpeedCount:585                     baseAbility.setSpeed(baseAbility.getSpeed() + value);586                     break;587                 case Toughness:588                     baseAbility.setToughness(baseAbility.getToughness() + value);589                     break;590                 case UnDCharmdel:591                     baseAbility.setUndcharmdel(baseAbility.getUndcharmdel() + value);592                     break;593                 case UnMCharmdel:594                     baseAbility.setUnmcharmdel(baseAbility.getUnmcharmdel() + value);595                     break;596                 case Willpower:597                     baseAbility.setWillpower(baseAbility.getWillpower() + value);598                     break;599                 case Wounds:600                     baseAbility.setWounds(baseAbility.getWounds() + value);601                     break;602             }603         }604     }605 606     /**607      * 构建属性,构建属性集合中比例属性加成,万分比格式608      * <br>609      * 慎重调用610      *611      * @param baseAbility612      */613     @Deprecated614     public void buildBaseAbilityPer(BaseAbility baseAbility) {615         for (Entry<AttKey, Integer> entry : this.entrySet()) {616             AttKey key = entry.getKey();617             Integer value = entry.getValue();618             switch (key) {619                 case ACPer:620                     baseAbility.setAc(baseAbility.getAc() + (int) (baseAbility.getAc() * (value / 10000D)));621                     break;622                 case DCper:623                     baseAbility.setDcmin(baseAbility.getDcmin() + (int) (baseAbility.getDcmin() * (value / 10000D)));624                     baseAbility.setDcmax(baseAbility.getDcmax() + (int) (baseAbility.getDcmax() * (value / 10000D)));625                     break;626                 case HPMaxper:627                     baseAbility.setHpmax(baseAbility.getHpmax() + (int) (baseAbility.getHpmax() * (value / 10000D)));628                     break;629                 case MCper:630                     baseAbility.setMcmin(baseAbility.getMcmin() + (int) (baseAbility.getMcmin() * (value / 10000D)));631                     baseAbility.setMcmax(baseAbility.getMcmax() + (int) (baseAbility.getMcmax() * (value / 10000D)));632                     break;633                 case MacPer:634                     baseAbility.setMac(baseAbility.getMac() + (int) (baseAbility.getMac() * (value / 10000D)));635                     break;636                 case SpeedPer:637                     baseAbility.setSpeed(baseAbility.getSpeed() + (int) (baseAbility.getSpeed() * (value / 10000D)));638                     break;639             }640         }641     }642 643     @Override644     public String toString() {645         for (Entry<AttKey, Integer> entry : this.entrySet()) {646             AttKey key = entry.getKey();647             Integer value = entry.getValue();648         }649         return "PlayerAttribute{" + '}';650     }651 652     /**653      * 所有属性清零654      */655     public void clearZoer() {656         for (Entry<AttKey, Integer> entry : this.entrySet()) {657             AttKey key = entry.getKey();658             Integer value = entry.getValue();659             this.put(key, 0);660         }661     }662 663     /**664      * 累计665      *666      * @param playerAttribute667      */668     public void add(PersonAttribute playerAttribute) {669         for (Entry<AttKey, Integer> entry : playerAttribute.entrySet()) {670             AttKey key = entry.getKey();671             Integer value = entry.getValue();672             Integer get = this.get(key);673             value += get;674             this.put(key, value);675         }676         this.expMax += playerAttribute.expMax;677     }678 679     /**680      *681      * @param key682      * @param value683      */684     public void add(int key, Integer value) {685         add(AttKey.parse(key), value);686     }687 688     /**689      *690      * @param key691      * @param value692      */693     public void add(AttKey key, Integer value) {694         if (key != null) {695             Integer get = this.get(key);696             value += get;697             this.put(key, value);698         }699     }700 701     public Long getExpMax() {702         return expMax;703     }704 705     public void setExpMax(Long expMax) {706         this.expMax = expMax;707     }708 709     public static void main(String[] args) {710         String toString = PersonAttribute.AttKey.Initiative.toString();711         System.out.println(toString);712         System.out.println(PersonAttribute.AttKey.parse(toString).getValue());713     }714 }

这个类用于策划配置方式解析的,

策划在配置属性的时候只需要配置出来,就能通用解析。

 1     // <editor-fold defaultstate="collapsed" desc="返回属性键值对 public static void getAttribute(PersonAttribute attribute, String attString)"> 2     /** 3      * 返回属性键值对 4      * 5      * @param attribute 6      * @param attString 配置的属性 7      */ 8     public static void getAttribute(PersonAttribute attribute, String attString) { 9         if (StringUtil.isNullOrEmpty(attString)) {10             return;11         }12         String[] atts = attString.split(DOUHAO_REG);13         for (String att : atts) {14             String[] split = att.split("=");15             Integer integer = Integer.parseInt(split[0]);16             Integer integer1 = Integer.parseInt(split[1]);17             attribute.add(integer, integer1);18         }19     }20     // </editor-fold>21 22     public static void main(String[] args) {23         String str = "34052=792,34050=1291,34051=3";24         PersonAttribute personAttribute = new PersonAttribute();25         getAttribute(personAttribute, str);26     }

在精灵对象身上只需要挂载

1     // 属性2     //最终计算属性3     protected BaseAbility finalAbility = new BaseAbility();4 5     //-------------------属性部分-------------------------//6     private /*transient这样可能会导致离线竞技场角色数据不正确*/ HashMap<Integer, PersonAttribute> attributes = new HashMap<>();7     //其他属性8     protected PersonAttribute otherAttribute = new PersonAttribute();

就能分门别类的计算全部属性

 1     @Override 2     public void computeAttribute(Player player, boolean updateTopListFightPower) { 3         synchronized (player.abilityLock) { 4             player.abilityLock.update(); 5  6             PersonAttribute finalAbility = new PersonAttribute(); 7  8             HashMap<Integer, PersonAttribute> attributes = player.getAttributes(); 9             //先把非buff的属性计算完成10             for (Map.Entry<Integer, PersonAttribute> entry : attributes.entrySet()) {11                 Integer key = entry.getKey();12                 if (key != PersonAttributeType.BUFF) {13                     PersonAttribute playerAttribute = entry.getValue();14                     if (playerAttribute != null) {15                         finalAbility.add(playerAttribute);16                     }17                 }18             }19             player.getFinalAbility().clearZero();20             //构建基础属性21             finalAbility.buildBaseAbility(player.getFinalAbility());22             finalAbility.buildBaseAbilityPer(player.getFinalAbility());23 24             //清零后计算buff25             finalAbility.clear();26 27             //再计算buff的属性计算完成28             for (Map.Entry<Integer, PersonAttribute> entry : attributes.entrySet()) {29                 Integer key = entry.getKey();30                 if (key == PersonAttributeType.BUFF) {31                     PersonAttribute playerAttribute = entry.getValue();32                     if (playerAttribute != null) {33                         finalAbility.add(playerAttribute);34                     }35                 }36             }37             //构建基础属性38             //先计算buff加成39             finalAbility.buildBaseAbilityPer(player.getFinalAbility());40             //在计算buff基础点数41             finalAbility.buildBaseAbility(player.getFinalAbility());42             //设置经验比例加成43             player.setExpMultiple(1 + finalAbility.get(PersonAttribute.AttKey.ExpPer)); // 特殊处理经验BUFF经验BUFF44             player.getFinalAbility().zeroAbility();45             log.error("当前速度:" + player.getFinalAbility().getSpeed());46             {47                 //属性,加成48                 //物理攻击加成49                 player.getFinalAbility().setDcmin(player.getFinalAbility().getDcmin() + player.getFinalAbility().getStrength());50                 player.getFinalAbility().setDcmax(player.getFinalAbility().getDcmax() + player.getFinalAbility().getStrength());51                 //物理防御52                 player.getFinalAbility().setAc(player.getFinalAbility().getAc() + player.getFinalAbility().getStrength());53                 //生命上限54                 player.getFinalAbility().setHpmax(player.getFinalAbility().getHpmax() + player.getFinalAbility().getWounds() * 8);55                 //魔法攻击56                 player.getFinalAbility().setMcmin(player.getFinalAbility().getMcmin() + player.getFinalAbility().getIntelligence());57                 player.getFinalAbility().setMcmax(player.getFinalAbility().getMcmax() + player.getFinalAbility().getIntelligence());58                 //魔法防御59                 player.getFinalAbility().setMac(player.getFinalAbility().getMac() + player.getFinalAbility().getIntelligence());60                 //魔法值上限61                 player.getFinalAbility().setMpmax(player.getFinalAbility().getMpmax() + player.getFinalAbility().getIntelligence() * 6);62                 //闪避63                 player.getFinalAbility().setDuck(player.getFinalAbility().getDuck() + player.getFinalAbility().getInitiative());64                 //韧性65                 player.getFinalAbility().setToughness(player.getFinalAbility().getToughness() + (int) (player.getFinalAbility().getInitiative() * 0.5));66                 //命中67                 player.getFinalAbility().setHit(player.getFinalAbility().getHit() + (int) (player.getFinalAbility().getWillpower() * 0.5));68                 //暴击69                 player.getFinalAbility().setCritValuePer(player.getFinalAbility().getCritValuePer() + (int) (player.getFinalAbility().getWillpower()));70 71             }72 73             if (updateTopListFightPower && !player.isArenaRobot() && player.getLevel() >= TopListManager.SYNC_PLAYER_LEVEL) { // 如BUFF等改变玩家属性,将不触发排行榜74 //                log.error("玩家战斗力改变,触发战力排行榜");75                 TopListManager.getInstance().updateAllTopData(player, null, TopListManager.TOP_POWER);76             }77         }78     }

只是我们游戏目前属性计算方式;

没有特别的说明,也没有多少描述,简单的贴出代码和一些思路;

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 二年级法制小报怎么办 机动车异地年检委托书怎么办 签了委托书反悔怎么办 签了空白委托书怎么办 说我人品不好怎么办 对于插队的人怎么办 与领导发生矛盾怎么办 老员工不服从管理怎么办 与顾客发生争执怎么办 同事之间闹矛盾怎么办 和员工发生争执怎么办 被员工威胁恐吓怎么办 员工拿离职威胁怎么办 员工跟顾客吵架怎么办 和朋友发生争执怎么办 和领导吵架后怎么办 老板不尊重员工怎么办 上司不尊重我怎么办 下属不尊重老板怎么办 战地4开挂被ban怎么办 照相的单词怎么办写 gmdss证书已经过期怎么办 脾气太火爆了怎么办 满月宝宝脾气急怎么办 多颗牙齿缺失怎么办 孩子没有学习动力怎么办 裤子穿着往上跑怎么办 伤囗发炎了怎么办 玩派派背包食物不足怎么办 80岁老人植物人怎么办 steam账户创不起怎么办 小孩读书没有居住证怎么办 小孩上学没有准生证怎么办 小学在外地初中怎么办 小孩上学没准生证怎么办 没结婚出生证明怎么办 异地上高中高考怎么办 高中去外地上学怎么办 农村在城里上学怎么办? 父母没钱不工作怎么办 qq被家长偷看怎么办