首页 > 代码库 > 游戏中精灵对象的属性功能设计
游戏中精灵对象的属性功能设计
我们大部分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 =http://www.mamicode.com/ 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 = http://www.mamicode.com/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 = http://www.mamicode.com/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="http://www.mamicode.com/+ 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 =http://www.mamicode.com/ 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 = http://www.mamicode.com/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 = http://www.mamicode.com/0;382 switch (attKey) {383 case AttackPower: //384 {385 switch (job) {386 //物理系列387 case 1://骑士388 case 3://射手389 case 5://屠杀者390 value =http://www.mamicode.com/ RandomUtils.random(baseAbility.getDcmin(), baseAbility.getDcmax());391 break;392 //魔法系列393 case 2://法师394 case 4://刺客395 value =http://www.mamicode.com/ RandomUtils.random(baseAbility.getMcmin(), baseAbility.getMcmax());396 break;397 }398 }399 break;400 case AC:401 case ACCount:402 value =http://www.mamicode.com/ baseAbility.getAc();403 break;404 case AttackSpeed:405 value =http://www.mamicode.com/ baseAbility.getAttackSpeed();406 break;407 case AutoBattleHP:408 value =http://www.mamicode.com/ baseAbility.getAuto_battle_hp();409 break;410 case AutoBattleMP:411 value =http://www.mamicode.com/ baseAbility.getAuto_battle_mp();412 break;413 case AutoHP:414 value =http://www.mamicode.com/ baseAbility.getAutohp();415 break;416 case AutoMP:417 value =http://www.mamicode.com/ baseAbility.getAutomp();418 break;419 case CritValue:420 value =http://www.mamicode.com/ baseAbility.getCritvalue();421 break;422 case CritValuePer:423 value =http://www.mamicode.com/ baseAbility.getCritValuePer();424 break;425 case DCharmdel:426 value =http://www.mamicode.com/ baseAbility.getDcharmdel();427 break;428 case DCmin:429 case DCmax:430 value =http://www.mamicode.com/ RandomUtils.random(baseAbility.getDcmin(), baseAbility.getDcmax());431 break;432 case Dcuk:433 value =http://www.mamicode.com/ baseAbility.getDuck();434 break;435 case Fight:436 value =http://www.mamicode.com/ baseAbility.getFight();437 break;438 case HPMax:439 value =http://www.mamicode.com/ baseAbility.getHpmax();440 break;441 case Hit:442 value =http://www.mamicode.com/ baseAbility.getHit();443 break;444 case Initiative:445 value =http://www.mamicode.com/ baseAbility.getInitiative();446 break;447 case Intelligence:448 value =http://www.mamicode.com/ baseAbility.getIntelligence();449 break;450 case MCharmdel:451 value =http://www.mamicode.com/ baseAbility.getMcharmdel();452 break;453 case MCmax:454 case MCmin:455 value =http://www.mamicode.com/ RandomUtils.random(baseAbility.getMcmin(), baseAbility.getMcmax());456 break;457 case Mac:458 case MacCount:459 value =http://www.mamicode.com/ baseAbility.getMac();460 break;461 case MpMax:462 value =http://www.mamicode.com/ baseAbility.getMpmax();463 break;464 case Strength:465 value =http://www.mamicode.com/ baseAbility.getStrength();466 break;467 case Speed:468 case SpeedCount:469 value =http://www.mamicode.com/ baseAbility.getSpeed();470 break;471 case Toughness:472 value =http://www.mamicode.com/ baseAbility.getToughness();473 break;474 case UnDCharmdel:475 value =http://www.mamicode.com/ baseAbility.getUndcharmdel();476 break;477 case UnMCharmdel:478 value =http://www.mamicode.com/ baseAbility.getUnmcharmdel();479 break;480 case Willpower:481 value =http://www.mamicode.com/ baseAbility.getWillpower();482 break;483 case Wounds:484 value =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 }
只是我们游戏目前属性计算方式;
没有特别的说明,也没有多少描述,简单的贴出代码和一些思路;
游戏中精灵对象的属性功能设计
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。