游戏中精灵对象的属性功能设计
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游戏中精灵对象的属性功能设计相关的知识,希望对你有一定的参考价值。
我们大部分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 [email protected]<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 * 主动,1002 363 */ 364 this.initiative = 0; 365 /** 366 * 智慧,1003 367 */ 368 this.intelligence = 0; 369 /** 370 * 意志,1004 371 */ 372 this.willpower = 0; 373 /** 374 * 体魄,1005 375 */ 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 * 主动,1002 413 */ 414 this.initiative = this.initiative > 0 ? this.initiative : 0; 415 /** 416 * 智慧,1003 417 */ 418 this.intelligence = this.intelligence > 0 ? this.intelligence : 0; 419 /** 420 * 意志,1004 421 */ 422 this.willpower = this.willpower > 0 ? this.willpower : 0; 423 /** 424 * 体魄,1005 425 */ 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 -8000 447 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 @Override 456 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 [email protected]<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 * 魔法攻击增加,2013 102 */ 103 MCcount(2013, "魔法攻击增加"), 104 /** 105 * 魔法攻击万分比提升,2014 106 */ 107 MCper(2014, "魔法攻击万分比提升"), 108 /** 109 * 物理防御上限,2021 110 */ 111 AC(2021, "物理防御"), 112 /** 113 * 物防增加,2023 114 */ 115 ACCount(2023, "物防增加"), 116 /** 117 * 物理防御万分比提升,2024 118 */ 119 ACPer(2024, "物理防御万分比提升"), 120 /** 121 * 魔法防御上限,2031 122 */ 123 Mac(2031, "魔法防御"), 124 /** 125 * 魔防增加,2033 126 */ 127 MacCount(2033, "魔防增加"), 128 /** 129 * 魔法防御万分比提升,2034 130 */ 131 MacPer(2034, "魔法防御万分比提升"), 132 /** 133 * 最大魔法,2041 134 */ 135 MpMax(2041, "最大魔法"), 136 /** 137 * 最大魔法万分比提升,2042 138 */ 139 MPMaxper(2042, "最大魔法万分比提升"), 140 /** 141 * 当前魔法回复(战斗状态),2043 142 */ 143 MPFightCount(2043, "当前魔法回复(战斗状态)"), 144 /** 145 * 当前魔法回复(非战斗状态),2044 146 */ 147 MPCount(2044, "当前魔法回复(非战斗状态)"), 148 /** 149 * 当前魔法值回复万分比,2045 150 */ 151 MPPer(2045, "当前魔法值回复万分比"), 152 /** 153 * 当前魔法值,2046 154 */ 155 MP(2047, "当前魔法值"), 156 /** 157 * 自动回复生命,2058 158 */ 159 AutoMP(2048, "自动回复魔法值"), 160 /** 161 * 战斗状态自动回复魔法值,2049 162 */ 163 AutoBattleMP(2049, "战斗状态自动回复魔法值"), 164 /** 165 * 最大血量,2051 166 */ 167 HPMax(2051, "最大血量"), 168 /** 169 * 最大血量万分比提升,2052 170 */ 171 HPMaxper(2052, "最大血量万分比提升"), 172 /** 173 * 当前生命回复(战斗状态),2053 174 */ 175 HPFightCount(2053, "当前生命回复(战斗状态)"), 176 /** 177 * 当前生命回复(非战斗状态),2054 178 */ 179 HPCount(2054, "当前生命回复(非战斗状态)"), 180 /** 181 * 当前生命回复万分比,2055 182 */ 183 HPPer(2055, "当前生命回复万分比"), 184 /** 185 * 当前生命,2057 186 */ 187 HP(2057, "当前生命"), 188 /** 189 * 自动回复生命,2058 190 */ 191 AutoHP(2058, "自动回复生命"), 192 /** 193 * 战斗状态自动回复生命,2059 194 */ 195 AutoBattleHP(2059, "战斗状态自动回复生命"), 196 /** 197 * 闪避,2061 198 */ 199 Dcuk(2061, "闪避"), 200 /** 201 * 韧性,2071 202 */ 203 Toughness(2071, "韧性"), 204 /** 205 * 命中准确,2081 206 */ 207 Hit(2081, "命中准确"), 208 /** 209 * 暴击,2091 210 */ 211 CritValue(2091, "暴击"), 212 /** 213 * 物理伤害减免,2101 214 */ 215 DCharmdel(2101, "物理伤害减免"), 216 /** 217 * 魔法减伤,2111 218 */ 219 MCharmdel(2111, "魔法减伤"), 220 /** 221 * 物理反伤,2121 222 */ 223 UnDCharmdel(2121, "物理反伤"), 224 /** 225 * 魔法反伤,2131 226 */ 227 UnMCharmdel(2131, "魔法反伤"), 228 /** 229 * 暴击伤害加成的倍率,2141 230 */ 231 CritValuePer(2141, "暴击伤害加成的倍率"), 232 /** 233 * 2151, "升级所需经验值" 234 */ 235 // ExpMax(2151, "升级所需经验值"), 236 /** 237 * 当前经验值,2152 238 */ 239 Exp(2152, "获得经验值"), 240 /** 241 * 经验加成(万分比),2153 242 */ 243 ExpPer(2153, "经验加成(万分比)"), 244 /** 245 * 经验加成(固定点数),2154 246 */ 247 ExpCount(2154, "经验加成(固定点数)"), 248 /** 249 * 移动速度,2161 250 */ 251 Speed(2161, "移动速度"), 252 /** 253 * 移动速度加成(万分比),2162 254 */ 255 SpeedPer(2162, "移动速度加成(万分比)"), 256 /** 257 * 移动速度加成(点数),2163 258 */ 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 * 战斗力,9999 294 */ 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 * 根据索引获取key 307 * 308 * @param key 309 * @return 310 */ 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 key 324 * @return 325 */ 326 public static AttKey parse(String key) { 327 return Enum.valueOf(AttKey.class, key); 328 } 329 330 /** 331 * 键值 332 * 333 * @return 334 */ 335 public int getKey() { 336 return key; 337 } 338 339 /** 340 * 描述字符 341 * 342 * @return 343 */ 344 public String getValue() { 345 return value; 346 } 347 348 } 349 350 @Override 351 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而不是null 357 * 358 * @param key 359 * @return 360 */ 361 @Override 362 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 baseAbility 377 * @param attKey 378 */ 379 @Deprecated 380 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 baseAbility 496 */ 497 @Deprecated 498 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 baseAbility 612 */ 613 @Deprecated 614 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 @Override 644 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 playerAttribute 667 */ 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 key 682 * @param value 683 */ 684 public void add(int key, Integer value) { 685 add(AttKey.parse(key), value); 686 } 687 688 /** 689 * 690 * @param key 691 * @param value 692 */ 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 //清零后计算buff 25 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经验BUFF 44 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 }
只是我们游戏目前属性计算方式;
没有特别的说明,也没有多少描述,简单的贴出代码和一些思路;
以上是关于游戏中精灵对象的属性功能设计的主要内容,如果未能解决你的问题,请参考以下文章