当前位置:   article > 正文

今天开始做战斗,回合制战斗代码实现第二篇,九宫格战斗_cocos2dx 回合战斗

cocos2dx 回合战斗

     说到九宫格战斗,就不能不提一款游戏《神仙道》,在神仙道之前,九宫格战斗的模式就在几款游戏里面有应用,但神仙道是真真正正把这种战斗模式发扬光大的里程碑,当时无论口碑,还是市场占有率都可以说是空前的,这款游戏我玩到150级,可以说是投入精力比较大的一款游戏,在游戏里面也交了很多朋友,虽然最近这种游戏模式因为一些原因走下坡路(现阶段刀塔传奇这种模式的游戏很吃香),不过既然说回合制游戏,那么就还是讨论一下。

一、战斗系统概述
1此战斗系统适用于PVE(玩家与怪物战斗)和PVP(玩家与玩家战斗)
2游戏为横版,攻守双方分部屏幕左右两边                  
3战场上攻防双方各有一个3*3的9宫格方阵
4回合制战斗,按双方各自的出手顺序

二、战斗内容
2.1战斗单位
2.1.1战场上的一方最多只能有五个战斗单位,战斗单位包括主角和伙伴(这个在后期改为有一个伙伴作为后备,当前排角色死亡后来填补空缺【不过反响并不好】)
2.1.2每场战斗可以派遣数个伙伴随主角一起参与,最高参与人数与奇术系统相关
2.2战斗触发
2.2.1战斗触发入口多人副本入口、开启活动副本入口
2.2.2触碰明雷怪在单人副本中行走进入明雷怪触发战斗范围后,切换至战斗画面
2.3战斗规则
2.3.1回合制每场战斗20回合,如果回合满则自动结束战斗
2.3.2攻击顺序
A.按照双方先攻值判断队伍出手先后顺序
B.按本方出手顺序依次筛选出第N个出手的战斗单位
C.死亡的战斗单位不参与筛选,如果本方第N个出手的战斗单位死亡,则本轮次轮空
2.4战场形势
2.4.1战场位置战场上攻防双方各有一个3*3的9宫格方阵,根据阵型不同,玩家可以布置
2.4.2战斗位置编号为9宫格每个格子进行编号,阵型系统根据编号,给予上场的单位出手顺序

2.5战斗带入属性
 2.5.1玩家等级1-100(这里用100是因为100级之前神仙道的概率公式直接使用百分数,110之后更新,概率由百分数改为概率等级,参考魔兽世界600等级==1%)
 2.5.2职业剑灵、飞羽、将星、武圣、方士、术士
 2.5.3HP每个战斗单位的总血量值
 2.5.4普通攻击力/法术攻击力物理职业读取普通攻击力值,法师职业读取法术攻击力值
 2.5.5普通防御力/法术防御力物理职业读取普通防御力值,法师职业读取法术防御力值
 2.5.6绝技攻击力士气达到100时,释放绝技时读取的绝技攻击力值
 2.5.7绝技防御力受到绝技伤害时,读取的绝技防御力值
 2.5.8命中概率、闪避概率(出手战斗单位命中概率-防御方闪避)是一个在[0,1]区间的概率值(110之后改为概率等级),决定是否成功命中对方或被对方躲避掉此次伤害
 2.5.9  暴击概率成功触发暴击事件的概率(110之后改为概率等级
 2.5.10 减少对方暴击减少对方触发暴击事件的概率(110之后改为概率等级
 2.5.11 必杀增加触发暴击事件后产生的伤害值(110之后改为概率等级
 2.5.12 格挡概率成功触发格挡事件的概率(110之后改为概率等级
 2.5.13 减少对方格挡减少对方触发格挡事件的概率(110之后改为概率等级
 2.5.14 士气值士气值累积达到100时,触发绝技(110之后改为概率等级
2.6攻击事件
2.6.1普通攻击物理攻击型战斗单位在士气未达到100时的攻击方式
2.6.2法术攻击法术攻击型战斗单位在士气未达到100时的攻击方式
2.6.3绝技攻击战斗单位的士气值达到100时的攻击方式
2.6.4血量减少攻击放成功给予目标战斗单位伤害后,目标战斗单位血量减少
2.6.5暴击按暴击概率是否成功触发暴击事件,若成功触发则产生(1+0.5+必杀值)*E的伤害,失败则伤害值仍为E(E为按攻防公式产生的非绝技伤害值)
2.6.6命中出手战斗单位成功对目标战斗单位造成单次伤害
2.6.7闪避目标战斗单位成功躲避出手战斗单位造成的单次伤害
2.6.8格挡按概率成功触发格挡事件后,受到的伤害值减半,状态维持1回合
2.6.9反击被近战单体攻击并触发格挡之后,触发反击对对方造成数值为E的伤害
 2.6.10士气
A.获得:初始值及获得士气值见下表(身上有特殊BUFF时也会获得士气值)
职业初始默认值物理攻击被物理攻击法术攻击被法术攻击绝技攻击被绝技攻击BUFF增加
剑灵502525252500参见BUFF表
武圣502525252500参见BUFF表
飞羽502525252500参见BUFF表
将星502525252500参见BUFF表
方士502525252500参见BUFF表
术士502525252500参见BUFF表
B.消耗
每次士气值达到或超过100触发绝技后,士气值减少至0
受到减少士气值的技能攻击,士气值减少
2.7战斗结果
2.7.1一方的所有战斗单位的血量和为0,战斗结束。战斗单位血量和大于0的一方获胜
2.7.2每场战斗只有20回合,如果20回合后双方没有分出胜负,则防守方(战斗画面右方)胜利
2.8战斗奖励
2.8.1战斗之后根据配置文件处理战斗获得
2.8.2战斗中死亡的战斗单位也可以获得经验奖励。经验奖励只与战斗结果有关,即战斗胜利,
胜利方的所有参战的战斗单位都可以获得经验奖励,战斗胜利,所有战斗单位没有经验
奖励
2.9战斗结束后的血量补充
2.9.1战斗单位升级  血量自动补满
2.9.2战斗单位未升级
A.主角身上有血池buff
a.血池足够所有参战的战斗单位血量补满(补给血量值为A),血池血量减少A
b.血池不足按照战斗单位的出手顺序为战斗单位依次补给血量
实例:
战斗单位出手顺序总HP当前HP血池血量需要的补给实际的补给
A140001000
0
30003000
B2400020001846220002000
C34000100030003000
D44000150025002500
c.特殊情况:
D当前HP为0,在恢复C血时已经消耗掉血池的全部存余血量,默认为D增加1点HP
B.主角身上无血池buff
战斗单位血量为0,自动为其增加1点血量
战斗单位剩余血量不为0,不增加血量

三、战斗表现形式
3.1状态说明
状态说明
普通近程攻击出手战斗单位从原地消失→播放向目标战斗单位前进的动作→播放出手战斗单位的攻击动作以及目标战斗单位被攻击的动作→目标战斗单位损失血量→出手战斗单位消失→播放出手战斗单位退回原地的动作→出手战斗单位出现在原位
普通远程攻击播放出手战斗单位的攻击动作及特效→播放目标战斗单位的被攻击动作及特效→目标战斗单位损失血量
普通法术攻击播放出手战斗单位的攻击动作及特效→播放目标战斗单位的被攻击动作及特效→目标战斗单位损失血量
绝技攻击播放出手战斗单位的攻击动作及特效→播放目标战斗单位的被攻击动作及特效→目标战斗单位损失血量
闪避播放出手战斗单位的攻击动作及特效→播放目标战斗单位的被攻击动作及特效,同时在目标战斗单位出现“闪避”字样
暴击播放出手战斗单位的攻击动作及特效,同时在出手战斗单位出现“暴击”字样→播放目标战斗单位的被攻击动作及特效→目标战斗单位损失血量
格挡播放出手战斗单位的攻击动作及特效→播放目标战斗单位的被攻击动作及特效,同时在目标战斗单位出现“格挡”字样→目标战斗单位损失血量
损失血量目标战斗单位显示减少的血量数值
反击目标战斗单位在格挡状态下,在目标战斗单位处出现“反击”字样→目标战斗单位从原地消失→播放向原出手战斗单位前进的动作→播放目标战斗单位的攻击动作以及出手战斗单位被攻击的动作→原出手战斗单位损失血量→目标战斗单位消失→播放目标战斗单位退回原地的动作→目标战斗单位出现在原位
四、流程图 

4.1战斗回合流程 4.2战斗轮次流程 4.3战斗行动准备流程

4.4战斗进行阶段流程4.5战斗结束阶段流程4.6buffer流程

4.7选择攻击方式流程4.8战斗单位死亡流程4.9战斗替补单位流程

战斗流程中的

命中、暴击、必杀、格挡计算流程

好了,战斗系统就这些,好家伙,真佩服策划的工作能力(上面这些是某公司山寨神仙道
时候的策划文档摘抄,这里感谢原作者)

好了,我们的文档这样就完成了,也就是说我们的战斗系统要做到上面文档要求的效果,那会是什么样的呢?这里感谢as3页游方面的专家leo老兄提供战斗系统源码,因为这里代码有现成的,我们只是做代码分析,因为这个战斗系统代码不是我写的这里就不公开散布了,所以需要源码的小伙伴可以私信给我吐舌头。我们这里只做分析。

我们先看看配置文件,战斗的battle数据文件(本来应该是服务器即使生成)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <battle id="1" name="战役1" exp="1000" gold="200" itemID="1001" battleMapID="BattleMap100">
  4. <!-- item中type 1为玩家,2为敌人 place值从0—8中随便填 -->
  5. <item actionName="Action_AddObject" type="1" roleType="1" roleID="1001"
  6. objID="3000" place="1" hp="1000" name="简雨"/>
  7. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2001"
  8. objID="4000" place="5" hp="1000" name="测试怪1"/>
  9. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2003"
  10. objID="4001" place="6" hp="1000" name="测试怪2"/>
  11. <!-- 战斗攻击指令,技能可以攻击一个目标或多个目标,技能没有MISS,普通攻击只能攻击一个目标,会有反击/抵挡/暴击/闪避
  12. -->
  13. <item actionName="Action_Attack" type="2" fire="3000" target="4000" damage="200"
  14. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  15. isJink="0"/>
  16. <item actionName="Action_Attack" type="2" fire="4000" target="3000" damage="100"
  17. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  18. isJink="0"/>
  19. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="0"
  20. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  21. isJink="1"/>
  22. <item actionName="Action_Attack" type="2" fire="3000" target="4000,4001" damage="400,480"
  23. isSkill="1" skillID="100" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  24. isJink="0"/>
  25. <item actionName="Action_Attack" type="2" fire="4000" target="3000" damage="150"
  26. isSkill="1" skillID="200" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  27. isJink="0"/>
  28. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="80"
  29. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  30. isJink="0"/>
  31. <item actionName="Action_Attack" type="2" fire="3000" target="4000" damage="400"
  32. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  33. isJink="0"/>
  34. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="160"
  35. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  36. isJink="0"/>
  37. <item actionName="Action_Attack" type="2" fire="3000" target="4001" damage="400"
  38. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  39. isJink="0"/>
  40. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="70"
  41. isSkill="0" skillID="0" isBackAttack="1" backAttackDamage="50" isResis="0" isCrucial="0"
  42. isJink="0"/>
  43. <item actionName="Action_Attack" type="2" fire="3000" target="4001" damage="150"
  44. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="1" isCrucial="0"
  45. isJink="0"/>
  46. </battle>
  47. <battle id="2" name="战役2" exp="2000" gold="400" itemID="1004" battleMapID="BattleMap101">
  48. <!-- item中type 1为玩家,2为敌人 place值从0—8中随便填 -->
  49. <item actionName="Action_AddObject" type="1" roleType="1" roleID="1001"
  50. objID="3000" place="1" hp="1000" name="简雨"/>
  51. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2001"
  52. objID="4000" place="5" hp="1000" name="测试怪1"/>
  53. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2002"
  54. objID="4001" place="0" hp="1000" name="测试怪2"/>
  55. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2003"
  56. objID="4002" place="6" hp="1000" name="测试怪3"/>
  57. <!-- 战斗攻击指令,技能可以攻击一个目标或多个目标,技能没有MISS,普通攻击只能攻击一个目标,会有反击/抵挡/暴击/闪避
  58. -->
  59. <item actionName="Action_Attack" type="2" fire="3000" target="4000" damage="200"
  60. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  61. isJink="0"/>
  62. <item actionName="Action_Attack" type="2" fire="4000" target="3000" damage="100"
  63. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  64. isJink="0"/>
  65. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="0"
  66. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  67. isJink="1"/>
  68. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="50"
  69. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="1" isCrucial="0"
  70. isJink="0"/>
  71. <item actionName="Action_Attack" type="2" fire="3000" target="4000" damage="900"
  72. isSkill="1" skillID="101" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  73. isJink="0"/>
  74. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="210"
  75. isSkill="1" skillID="201" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  76. isJink="0"/>
  77. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="200"
  78. isSkill="1" skillID="202" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  79. isJink="0"/>
  80. <item actionName="Action_Attack" type="2" fire="3000" target="4001" damage="300"
  81. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  82. isJink="0"/>
  83. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="160"
  84. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  85. isJink="0"/>
  86. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="90"
  87. isSkill="0" skillID="0" isBackAttack="1" backAttackDamage="90" isResis="0" isCrucial="0"
  88. isJink="0"/>
  89. <item actionName="Action_Attack" type="2" fire="3000" target="4001" damage="200"
  90. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  91. isJink="0"/>
  92. <item actionName="Action_Attack" type="2" fire="4001" target="3000" damage="90"
  93. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  94. isJink="0"/>
  95. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="50"
  96. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="1" isCrucial="0"
  97. isJink="0"/>
  98. <item actionName="Action_Attack" type="2" fire="3000" target="4001" damage="770"
  99. isSkill="1" skillID="101" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  100. isJink="0"/>
  101. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="200"
  102. isSkill="1" skillID="203" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  103. isJink="0"/>
  104. </battle>
  105. <battle id="3" name="战役3" exp="3000" gold="600" itemID="1008" battleMapID="BattleMap102">
  106. <!-- item中type 1为玩家,2为敌人 place值从0—8中随便填 -->
  107. <item actionName="Action_AddObject" type="1" roleType="1" roleID="1002"
  108. objID="3001" place="6" hp="1000" name="测试人2"/>
  109. <item actionName="Action_AddObject" type="1" roleType="1" roleID="1001"
  110. objID="3000" place="1" hp="1000" name="简雨"/>
  111. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2001"
  112. objID="4000" place="1" hp="1000" name="测试怪1"/>
  113. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2002"
  114. objID="4001" place="4" hp="1000" name="测试怪2"/>
  115. <item actionName="Action_AddObject" type="1" roleType="2" roleID ="2003"
  116. objID="4002" place="8" hp="1000" name="测试怪3"/>
  117. <!-- 战斗攻击指令,技能可以攻击一个目标或多个目标,技能没有MISS,普通攻击只能攻击一个目标,会有反击/抵挡/暴击/闪避
  118. -->
  119. <item actionName="Action_Attack" type="2" fire="3000" target="4000" damage="100"
  120. isSkill="0" skillID="0" isBackAttack="1" backAttackDamage="50" isResis="0" isCrucial="0"
  121. isJink="0"/>
  122. <item actionName="Action_Attack" type="2" fire="3001" target="4000" damage="150"
  123. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  124. isJink="0"/>
  125. <item actionName="Action_Attack" type="2" fire="4000" target="3000" damage="150"
  126. isSkill="1" skillID="200" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  127. isJink="0"/>
  128. <item actionName="Action_Attack" type="2" fire="4001" target="3000,3001" damage="100,100"
  129. isSkill="1" skillID="201" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  130. isJink="0"/>
  131. <item actionName="Action_Attack" type="2" fire="4002" target="3001" damage="0"
  132. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  133. isJink="1"/>
  134. <item actionName="Action_Attack" type="2" fire="3000" target="4000,4001,4002" damage="200,250,300"
  135. isSkill="1" skillID="101" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  136. isJink="0"/>
  137. <item actionName="Action_Attack" type="2" fire="3001" target="4000" damage="150"
  138. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  139. isJink="0"/>
  140. <item actionName="Action_Attack" type="2" fire="4000" target="3001" damage="150"
  141. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  142. isJink="0"/>
  143. <item actionName="Action_Attack" type="2" fire="4001" target="3001" damage="50"
  144. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="1" isCrucial="0"
  145. isJink="0"/>
  146. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="170"
  147. isSkill="1" skillID="202" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  148. isJink="0"/>
  149. <item actionName="Action_Attack" type="2" fire="3000" target="4001" damage="300"
  150. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  151. isJink="0"/>
  152. <item actionName="Action_Attack" type="2" fire="3001" target="4001" damage="100"
  153. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  154. isJink="0"/>
  155. <item actionName="Action_Attack" type="2" fire="4000" target="3000" damage="200"
  156. isSkill="1" skillID="203" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  157. isJink="0"/>
  158. <item actionName="Action_Attack" type="2" fire="4001" target="3001" damage="100"
  159. isSkill="0" skillID="0" isBackAttack="1" backAttackDamage="80" isResis="0" isCrucial="0"
  160. isJink="0"/>
  161. <item actionName="Action_Attack" type="2" fire="4002" target="3001" damage="100"
  162. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  163. isJink="0"/>
  164. <item actionName="Action_Attack" type="2" fire="3000" target="4000" damage="200"
  165. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  166. isJink="0"/>
  167. <item actionName="Action_Attack" type="2" fire="3001" target="4000,4001,4002" damage="230,150,290"
  168. isSkill="1" skillID="104" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  169. isJink="0"/>
  170. <item actionName="Action_Attack" type="2" fire="4001" target="3001" damage="300"
  171. isSkill="1" skillID="204" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  172. isJink="0"/>
  173. <item actionName="Action_Attack" type="2" fire="4002" target="3001" damage="250"
  174. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  175. isJink="0"/>
  176. <item actionName="Action_Attack" type="2" fire="3000" target="4001,4002" damage="240,200"
  177. isSkill="1" skillID="105" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="0"
  178. isJink="0"/>
  179. <item actionName="Action_Attack" type="2" fire="4002" target="3000" damage="150"
  180. isSkill="0" skillID="0" isBackAttack="1" backAttackDamage="100" isResis="0" isCrucial="0"
  181. isJink="0"/>
  182. <item actionName="Action_Attack" type="2" fire="3000" target="4002" damage="250"
  183. isSkill="0" skillID="0" isBackAttack="0" backAttackDamage="0" isResis="0" isCrucial="1"
  184. isJink="0"/>
  185. </battle>
  186. </root>

接着看下文档类
  1. package leo
  2. {
  3. import flash.display.Sprite;
  4. import flash.events.MouseEvent;
  5. import flash.profiler.showRedrawRegions;
  6. import leo.controller.util.LayerUtil;
  7. import leo.proxy.GameConst;
  8. import leo.proxy.transmission.LoaderUtil;
  9. import leo.view.ui.BtnBattle;
  10. import leo.view.ui.BtnBattleTips;
  11. import leo.view.ui.UIBattleList;
  12. [SWF(width="1250",height="650",frameRate="24",backgroundColor="0")]
  13. public class BattlePlayer extends Sprite
  14. {
  15. private var curView :*;
  16. private var battleLayer :Sprite;
  17. private var popLayer :Sprite;
  18. private var btnBattle :BtnBattle;
  19. private var btnBattleTips :BtnBattleTips;
  20. public function BattlePlayer()
  21. {
  22. init();
  23. }
  24. private function init():void
  25. {
  26. LoaderUtil.I.loadConfig();
  27. this.battleLayer = new Sprite();
  28. this.popLayer = new Sprite();
  29. this.addChild(battleLayer);
  30. this.addChild(popLayer);
  31. LayerUtil.I.layerDict[GameConst.BATTLE_LAYER] = this.battleLayer;
  32. LayerUtil.I.layerDict[GameConst.POP_LAYER] = this.popLayer;
  33. GameConst.main = this;
  34. }
  35. /*
  36. public function rhand():void
  37. {
  38. btnBattle = new BtnBattle();
  39. this.addChild(btnBattle);
  40. btnBattleTips = new BtnBattleTips();
  41. btnBattleTips.x = btnBattle.x + btnBattle.width - 20;
  42. btnBattleTips.y = btnBattle.y + btnBattle.height - 20;
  43. btnBattleTips.mouseChildren = btnBattleTips.mouseEnabled = false;
  44. this.addChild(btnBattleTips);
  45. btnBattle.addEventListener(MouseEvent.MOUSE_UP,mouseHandler);
  46. }
  47. */
  48. public function setStage(view :*):void
  49. {
  50. if(this.curView && this.battleLayer && this.battleLayer.contains(this.curView))
  51. {
  52. this.curView.destroy;
  53. this.battleLayer.removeChild(this.curView);
  54. }
  55. battleLayer.addChild(view);
  56. }
  57. public function show():void
  58. {
  59. //btnBattle.visible = true;
  60. //btnBattle.mouseChildren = btnBattle.mouseEnabled = true;
  61. //btnBattleTips.play();
  62. }
  63. public function hide():void
  64. {
  65. //btnBattle.visible = false;
  66. //btnBattle.mouseChildren = btnBattle.mouseEnabled = false;
  67. //btnBattleTips.stop();
  68. }
  69. public function mouseHandler():void
  70. //private function mouseHandler(e :MouseEvent):void
  71. {
  72. trace("load");
  73. var view :UIBattleList = new UIBattleList(null);
  74. setStage(view);
  75. //hide();
  76. }
  77. }
  78. }
init方法中有LoaderUtil.I.loadConfig();我们看下LoaderUtil这个静态类

  1. package leo.proxy.transmission
  2. {
  3. import flash.display.BitmapData;
  4. import flash.display.Loader;
  5. import flash.display.LoaderInfo;
  6. import flash.events.Event;
  7. import flash.events.IOErrorEvent;
  8. import flash.net.URLLoader;
  9. import flash.net.URLRequest;
  10. import flash.system.ApplicationDomain;
  11. import flash.system.LoaderContext;
  12. import flash.utils.Dictionary;
  13. import flash.utils.getDefinitionByName;
  14. import leo.proxy.GameConst;
  15. import leo.proxy.battles.action.Action_AddObject;
  16. import leo.proxy.battles.action.Action_Attack;
  17. import leo.proxy.battles.action.IBattleAction;
  18. import leo.proxy.battles.vo.BattleVO;
  19. import leo.proxy.vo.BaseUI;
  20. import leo.proxy.vo.RoleAssetsVO;
  21. /**
  22. * 加载工具
  23. * @author leo
  24. *
  25. */
  26. public class LoaderUtil
  27. {
  28. private static var _I :LoaderUtil = null;
  29. /**
  30. * 加载器缓存
  31. */
  32. public var loaderDict :Dictionary = new Dictionary();
  33. /**
  34. * 所有加载过的UI的VO
  35. */
  36. public var fileList :Dictionary = new Dictionary();
  37. /**
  38. * 缓存的战斗VO表
  39. */
  40. public var battleVOList :Dictionary = new Dictionary();
  41. /**
  42. * 缓存战斗地图
  43. */
  44. public var battleMapDict :Dictionary = new Dictionary();
  45. /**
  46. * 总加载数
  47. */
  48. private var sum :int;
  49. /**
  50. * 当前已加载数
  51. */
  52. private var index :int;
  53. /**
  54. * 加载列表成功函数
  55. */
  56. private var rhand :Function;
  57. /**
  58. * 加载列表失败函数
  59. */
  60. private var fhand :Function;
  61. /**
  62. * 加载UI成功函数
  63. */
  64. private var uiRhand :Function;
  65. /**
  66. * 加载UI失败函数
  67. */
  68. private var uiFhand :Function;
  69. public function LoaderUtil(prv :PrivateClass)
  70. {
  71. }
  72. /**
  73. * 加载UI列表
  74. * @param list 完整路径列表
  75. * @param rhand
  76. * @param fhand
  77. *
  78. */
  79. public function loadList(list :Array,rhand :Function = null,fhand :Function = null):void
  80. {
  81. if(!list || list.length == 0)
  82. {
  83. return;
  84. }
  85. this.rhand = rhand;
  86. this.fhand = fhand;
  87. this.sum = 0;
  88. this.sum = list.length;
  89. for(var i :int = 0; i < list.length; i++)
  90. {
  91. var url :String = list[i] as String;
  92. var loader :CustomLoader = new CustomLoader();
  93. loader.id = url;
  94. loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
  95. loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);
  96. var loaderContext :LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);
  97. loader.load(new URLRequest(url),loaderContext);
  98. this.loaderDict[loader.id] = loader;
  99. }
  100. }
  101. /**
  102. * 加载UI列表成功
  103. * @param e
  104. *
  105. */
  106. private function completeHandler(e :Event):void
  107. {
  108. this.index++;
  109. var loader :CustomLoader = (e.target as LoaderInfo).loader as CustomLoader;
  110. loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeHandler);
  111. loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,errorHandler);
  112. if(this.loaderDict[loader.id])
  113. {
  114. loader.unload();
  115. delete this.loaderDict[loader.id];
  116. loader = null;
  117. }
  118. if(this.index == this.sum)
  119. {
  120. if(this.rhand != null)
  121. {
  122. rhand();
  123. rhand = null;
  124. fhand = null;
  125. }
  126. }
  127. }
  128. /**
  129. * 加载UI列表失败
  130. * @param e
  131. *
  132. */
  133. private function errorHandler(e :IOErrorEvent):void
  134. {
  135. if(this.fhand != null)
  136. {
  137. fhand();
  138. rhand = null;
  139. fhand = null;
  140. }
  141. var loader :CustomLoader = (e.target as LoaderInfo).loader as CustomLoader;
  142. loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeHandler);
  143. loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,errorHandler);
  144. trace("加载组ui出错");
  145. }
  146. /**
  147. * 加载单个UI
  148. * @param vo
  149. * @param rhand
  150. * @param fhand
  151. *
  152. */
  153. public function loadUI(vo :BaseUI,rhand :Function,fhand :Function = null):void
  154. {
  155. if(!vo)
  156. {
  157. return;
  158. }
  159. this.uiRhand = rhand;
  160. this.uiFhand = fhand;
  161. var url :String = vo.swfPath;
  162. var loader :CustomLoader = new CustomLoader();
  163. loader.id = url;
  164. loader.contentLoaderInfo.addEventListener(Event.COMPLETE,uiComplete);
  165. loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,uiError);
  166. var loaderContext :LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);
  167. loader.load(new URLRequest(url),loaderContext);
  168. this.loaderDict[loader.id] = loader;
  169. this.fileList[vo.swfPath] = vo;
  170. }
  171. /**
  172. * 加载单个UI成功
  173. * @param e
  174. *
  175. */
  176. private function uiComplete(e :Event):void
  177. {
  178. var loader :CustomLoader = (e.target as LoaderInfo).loader as CustomLoader;
  179. loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeHandler);
  180. loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,errorHandler);
  181. if(this.fileList[loader.id])
  182. {
  183. var vo :BaseUI = this.fileList[loader.id] as BaseUI;
  184. vo.isComplete = true;
  185. vo.isLoading = false;
  186. }
  187. if(this.loaderDict[loader.id])
  188. {
  189. loader.unload();
  190. delete this.loaderDict[loader.id];
  191. loader = null;
  192. }
  193. if(this.uiRhand != null)
  194. {
  195. this.uiRhand();
  196. this.uiRhand = null;
  197. uiFhand = null;
  198. }
  199. }
  200. /**
  201. * 加载单个UI失败
  202. * @param e
  203. *
  204. */
  205. private function uiError(e :IOErrorEvent):void
  206. {
  207. var loader :CustomLoader = (e.target as LoaderInfo).loader as CustomLoader;
  208. loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeHandler);
  209. loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,errorHandler);
  210. if(this.uiFhand != null)
  211. {
  212. uiFhand();
  213. this.uiRhand = null;
  214. uiFhand = null;
  215. }
  216. trace("加载单个ui出错");
  217. }
  218. /**
  219. * 加载config.xml
  220. *
  221. */
  222. public function loadConfig():void
  223. {
  224. var str :String = GameConst.CONFIG_XML;
  225. var loader :URLLoader = new URLLoader();
  226. loader.addEventListener(Event.COMPLETE,configComplete);
  227. loader.addEventListener(IOErrorEvent.IO_ERROR,configError);
  228. loader.load(new URLRequest(str));
  229. }
  230. /**
  231. * 加载config.xml成功
  232. * @param e
  233. *
  234. */
  235. private function configComplete(e :Event):void
  236. {
  237. var xml :XML = new XML(((e.target) as URLLoader).data);
  238. GameConst.uiDir = xml.uiDir;
  239. GameConst.itemDir = xml.itemDir;
  240. GameConst.roleDir = xml.roleDir;
  241. GameConst.mapDir = xml.mapDir;
  242. GameConst.battleXML = xml.battleXML;
  243. var str :String = xml.ui;
  244. var ary :Array = str.split(",");
  245. while(ary.length > 0)
  246. {
  247. var url :String = GameConst.uiDir + ary.pop() + ".swf";
  248. GameConst.uiList.push(url);
  249. }
  250. ((e.target) as URLLoader).removeEventListener(Event.COMPLETE,configComplete);
  251. ((e.target) as URLLoader).removeEventListener(IOErrorEvent.IO_ERROR,configError);
  252. loadBattleData();
  253. }
  254. /**
  255. * 加载config.xml失败
  256. * @param e
  257. *
  258. */
  259. private function configError(e :IOErrorEvent):void
  260. {
  261. ((e.target) as URLLoader).removeEventListener(Event.COMPLETE,configComplete);
  262. ((e.target) as URLLoader).removeEventListener(IOErrorEvent.IO_ERROR,configError);
  263. trace("加载config出错");
  264. }
  265. /**
  266. * 加载战斗XML
  267. *
  268. */
  269. private function loadBattleData():void
  270. {
  271. var loader :URLLoader = new URLLoader();
  272. var url :String = GameConst.battleXML;
  273. loader.addEventListener(Event.COMPLETE,battleXMLComplete);
  274. loader.addEventListener(IOErrorEvent.IO_ERROR,battleXMLError);
  275. loader.load(new URLRequest(url));
  276. }
  277. /**
  278. * 加载战斗XML成功
  279. * @param e
  280. *
  281. */
  282. private function battleXMLComplete(e :Event):void
  283. {
  284. var loader :URLLoader = e.target as URLLoader;
  285. var xml :XML = new XML(loader.data);
  286. for each(var battleXML :XML in xml.battle)
  287. {
  288. var battleVO :BattleVO = new BattleVO();
  289. battleVO.battleInfoVO.parse(battleXML,battleVO);
  290. for each(var actionXML :XML in battleXML.item)
  291. {
  292. var actionName :String= actionXML.@actionName;
  293. //注意一定要导入要实例化的类才能getDefinitionByName,要不然会报错
  294. importClass();
  295. var path :String = GameConst.PACKAGE_ACTION;
  296. var actionCls:Class = getDefinitionByName(path + actionName) as Class;
  297. var action:IBattleAction = new actionCls() as IBattleAction;
  298. action.parse(actionXML,battleVO);
  299. battleVO.actions.push(action);
  300. }
  301. this.battleVOList[battleVO.battleInfoVO.id] = battleVO;
  302. }
  303. loader.removeEventListener(Event.COMPLETE,battleXMLComplete);
  304. loader.removeEventListener(IOErrorEvent.IO_ERROR,battleXMLError);
  305. loader = null;
  306. //loadList(GameConst.uiList, GameConst.main.rhand);
  307. loadList(GameConst.uiList,GameConst.main.mouseHandler);
  308. }
  309. /**
  310. * 加载战斗XML失败
  311. * @param e
  312. *
  313. */
  314. private function battleXMLError(e :IOErrorEvent):void
  315. {
  316. var loader :URLLoader = e.target as URLLoader;
  317. loader.removeEventListener(Event.COMPLETE,battleXMLComplete);
  318. loader.removeEventListener(IOErrorEvent.IO_ERROR,battleXMLError);
  319. trace("加载战斗XML出错");
  320. }
  321. public function checkIsLoad(swfPath :String):Boolean
  322. {
  323. var vo :BaseUI = this.fileList[swfPath] as BaseUI;
  324. if(vo && (vo.isLoading || vo.isComplete))
  325. {
  326. return true;
  327. }
  328. return false;
  329. }
  330. private function importClass():void
  331. {
  332. var cls1 :Action_AddObject;
  333. var cls2 :Action_Attack;
  334. }
  335. public static function get I():LoaderUtil
  336. {
  337. if(_I == null)
  338. {
  339. _I = new LoaderUtil(new PrivateClass());
  340. }
  341. return _I;
  342. }
  343. }
  344. }
  345. class PrivateClass{}
public function loadConfig():void{}方法里面有这样一句var str :String = GameConst.CONFIG_XML;而得到xml的外部链接

  1. package leo.proxy
  2. {
  3. import flash.filters.GlowFilter;
  4. import leo.BattlePlayer;
  5. /**
  6. * 游戏常用的常量
  7. * @author leo
  8. *
  9. */
  10. public class GameConst
  11. {
  12. public static var main :BattlePlayer = null;
  13. public static const CONFIG_XML :String = "leo/assets/data/config.xml";
  14. // public static const CONFIG_XML :String = "http://www.longsihao.com/games/BattlePlayer/assets/data/netConfig.xml";
  15. public static var itemDir :String;
  16. public static var uiDir :String;
  17. public static var roleDir :String;
  18. public static var mapDir :String;
  19. public static var battleXML :String;
  20. public static var uiList :Array = [];
  21. public static var smallLoading :String = "smallLoading";
  22. public static const POP_LAYER :String = "pop_layer";
  23. public static const BATTLE_LAYER :String = "battle_layer";
  24. public static const PACKAGE_ACTION :String = "leo.proxy.battles.action.";
  25. public static const ROLE_ACTION_ARY :Array = ["attack","be_hit","fighting_idle"];
  26. public static const SPEED :int = 3;
  27. public static const MOUSE_ON :Array = [new GlowFilter(0xffff00,1,2,2,2,2)];
  28. public static const SKILL_NAME :Array = ["天魔杀星","冰凌剑空","灵木刺阵","十方剑气","天魔斩","八方棍法","雷动八方","琥珀冲杀","毒龙蚀天","地狱之火","葬林狂舞"];
  29. public function GameConst()
  30. {
  31. }
  32. }
  33. }
private function configComplete(e :Event):void{}方法中的

GameConst.uiDir = xml.uiDir;
GameConst.itemDir = xml.itemDir;
GameConst.roleDir = xml.roleDir;
GameConst.mapDir = xml.mapDir;
GameConst.battleXML = xml.battleXML;
trace得到xml.uiDir;=leo/assets/ui/
xml.itemDir=leo/assets/ui/
xml.roleDir=leo/assets/role/
xml.mapDir=leo/assets/map/
xml.battleXML=leo/assets/data/battles.xml

然后private function loadBattleData():void{}加载这战斗xml,我们可以看到trace("actionName=" + actionName);得到的xml文件数据


方法最后loadList(GameConst.uiList,GameConst.main.mouseHandler);加载进入游戏的控制列表

回到文档类中的public function mouseHandler():void{}方法中var view :UIBattleList = new UIBattleList(null);setStage(view);调用battleLayer.addChild(view);

将view加载到舞台上面,UIBattleList中的baseUI = new BaseUI("BattleList","BattleList");来加载battlelist.swf文件文件截图

override protected function swfLoadComplete():void{}中的this.itemList = new Vector.<UIBattleListItem>();

  1. package leo.proxy.vo
  2. {
  3. import leo.proxy.GameConst;
  4. /**
  5. * 加载UIVO基类
  6. * @author Leo
  7. *
  8. */
  9. public class BaseUI
  10. {
  11. public var fileName :String;
  12. public var linkName :String;
  13. public var isLoading :Boolean = true;
  14. public var isComplete :Boolean = false;
  15. public function BaseUI(fileName :String , linkName :String)
  16. {
  17. this.fileName = fileName;
  18. this.linkName = linkName;
  19. }
  20. public function get swfPath():String
  21. {
  22. return GameConst.uiDir + this.fileName + ".swf";
  23. }
  24. public function complete():void
  25. {
  26. this.isComplete = true;
  27. this.isLoading = false;
  28. }
  29. }
  30. }
  1. package leo.view.ui
  2. {
  3. import flash.display.SimpleButton;
  4. import flash.events.MouseEvent;
  5. import flash.text.TextField;
  6. import flash.utils.Dictionary;
  7. import leo.controller.util.UIUtil;
  8. import leo.proxy.GameConst;
  9. import leo.proxy.battles.vo.BattleVO;
  10. import leo.proxy.transmission.LoaderUtil;
  11. import leo.proxy.vo.BaseUI;
  12. /**
  13. * 战斗列表UI
  14. * @author Leo
  15. *
  16. */
  17. public class UIBattleList extends UILoadingBase
  18. {
  19. public static var I :UIBattleList;
  20. public var btnClose :SimpleButton;
  21. public var itemList :Vector.<UIBattleListItem>;
  22. public var btnLeft :SimpleButton;
  23. public var btnRight :SimpleButton;
  24. public var txtPage :TextField;
  25. public function UIBattleList(baseUI:BaseUI)
  26. {
  27. if(!baseUI)
  28. {
  29. baseUI = new BaseUI("BattleList","BattleList");
  30. }
  31. super(baseUI);
  32. }
  33. override protected function swfLoadComplete():void
  34. {
  35. super.swfLoadComplete();
  36. if(!content)
  37. {
  38. return;
  39. }
  40. this.itemList = new Vector.<UIBattleListItem>();
  41. binding(content,itemList,UIBattleListItem);
  42. btnClose = content.btnClose;
  43. this.btnLeft = content.btnLeft;
  44. this.btnRight = content.btnRight;
  45. this.txtPage = content.txtPage;
  46. data = [];
  47. var list :Dictionary = LoaderUtil.I.battleVOList;
  48. for (var key :* in list)
  49. {
  50. var vo :BattleVO = list[key] as BattleVO;
  51. if(vo)
  52. {
  53. data.push(vo);
  54. }
  55. }
  56. var index :int = 0;
  57. for each(var item :UIBattleListItem in itemList)
  58. {
  59. if(data[index])
  60. {
  61. item.data = data[index];
  62. }else
  63. {
  64. item.data = null;
  65. }
  66. index++;
  67. }
  68. addEventListener(MouseEvent.MOUSE_UP,mouseHandler);
  69. I = this;
  70. }
  71. private function mouseHandler(e :MouseEvent):void
  72. {
  73. trace("btn_close========");
  74. switch(e.target)
  75. {
  76. case this.btnClose:
  77. trace("btn_close");
  78. destroy();
  79. break;
  80. case this.btnLeft:
  81. trace("left");
  82. break;
  83. case this.btnRight:
  84. trace("right");
  85. break;
  86. }
  87. }
  88. override public function destroy():void
  89. {
  90. super.destroy();
  91. removeEventListener(MouseEvent.MOUSE_UP,mouseHandler);
  92. unBinding(itemList);
  93. if(this.parent)
  94. {
  95. this.parent.removeChild(this);
  96. }
  97. I = null;
  98. if(GameConst.main)
  99. {
  100. GameConst.main.show();
  101. }
  102. }
  103. }
  104. }



binding(content,itemList,UIBattleListItem);绑定了数据和战斗播放按钮,super.swfLoadComplete();调用了父类的方法中的content = BitmapUtil.I.getMCByName(baseUI.linkName);

  1. package leo.view.ui
  2. {
  3. import flash.display.DisplayObject;
  4. import flash.display.MovieClip;
  5. import flash.display.SimpleButton;
  6. import flash.events.MouseEvent;
  7. import flash.filters.GlowFilter;
  8. import flash.text.TextField;
  9. import flash.utils.ByteArray;
  10. import leo.controller.util.LayerUtil;
  11. import leo.proxy.GameConst;
  12. import leo.proxy.battles.vo.BattleVO;
  13. import leo.proxy.vo.BaseUI;
  14. /**
  15. * 战役列表子项
  16. * @author Leo
  17. *
  18. */
  19. public class UIBattleListItem extends SimpleButton
  20. {
  21. public var txtBattleName :TextField;
  22. public var txtBattleContent :TextField;
  23. public var txtBattleAward :TextField;
  24. public var mcContent :MovieClip;
  25. public var btnShow :SimpleButton;
  26. private var mc :MovieClip;
  27. private var _data :BattleVO;
  28. public function UIBattleListItem(mc :* = null)
  29. {
  30. if(mc)
  31. {
  32. this.mc = mc;
  33. this.txtBattleAward = mc.txtBattleAward;
  34. this.txtBattleContent = mc.txtBattleContent;
  35. this.txtBattleName = mc.txtBattleName;
  36. this.mcContent = mc.mcContent;
  37. this.btnShow = mc.btnShow;
  38. mc.addEventListener(MouseEvent.MOUSE_OVER,mouseHandler);
  39. mc.addEventListener(MouseEvent.MOUSE_OUT,mouseHandler);
  40. mc.addEventListener(MouseEvent.MOUSE_UP,mouseHandler);
  41. }
  42. super();
  43. }
  44. private function mouseHandler(e :MouseEvent):void
  45. {
  46. switch(e.type)
  47. {
  48. case MouseEvent.MOUSE_OVER:
  49. if(this.mcContent)
  50. {
  51. this.mcContent.filters = GameConst.MOUSE_ON;
  52. }
  53. break;
  54. case MouseEvent.MOUSE_OUT:
  55. if(this.mcContent)
  56. {
  57. this.mcContent.filters = null;
  58. }
  59. break;
  60. case MouseEvent.MOUSE_UP:
  61. switch(e.currentTarget)
  62. {
  63. case this.mc:
  64. case this.btnShow:
  65. show();
  66. }
  67. break;
  68. }
  69. }
  70. private function show():void
  71. {
  72. if(UIBattleList.I)
  73. {
  74. UIBattleList.I.destroy();
  75. }
  76. trace("开始播放战役");
  77. if(data)
  78. {
  79. var view :UIBattleView = new UIBattleView(data);
  80. LayerUtil.I.layerDict[UIBattleView.NAME] = view;
  81. GameConst.main.setStage(view);
  82. }
  83. if(GameConst.main)
  84. {
  85. GameConst.main.hide();
  86. }
  87. }
  88. public function get data():BattleVO
  89. {
  90. return _data;
  91. }
  92. public function set data(vo:BattleVO):void
  93. {
  94. _data = vo;
  95. if(vo == null)
  96. {
  97. this.mc.visible = false;
  98. return;
  99. }
  100. this.txtBattleName.text = vo.battleInfoVO.name;
  101. this.txtBattleContent.htmlText = "经验: " + "<font color='#fff000'>" + vo.battleInfoVO.exp + "</font>" + " " +
  102. "金币: " + "<font color='#fff000'>" + vo.battleInfoVO.gold + "</font>" + " " +
  103. "物品: " + "<font color='#fff000'>" + vo.battleInfoVO.itemID + "</font>";
  104. }
  105. public function destroy():void
  106. {
  107. mc.addEventListener(MouseEvent.MOUSE_OVER,mouseHandler);
  108. mc.addEventListener(MouseEvent.MOUSE_OUT,mouseHandler);
  109. mc.addEventListener(MouseEvent.MOUSE_UP,mouseHandler);
  110. mc = null;
  111. txtBattleName = null;
  112. txtBattleContent = null;
  113. txtBattleAward = null;
  114. mcContent = null;
  115. btnShow = null;
  116. }
  117. }
  118. }
mc.addEventListener(MouseEvent.MOUSE_OVER,mouseHandler);
mc.addEventListener(MouseEvent.MOUSE_OUT,mouseHandler);
mc.addEventListener(MouseEvent.MOUSE_UP,mouseHandler);

这3行来控制生成之后的mc按键case MouseEvent.MOUSE_UP:
switch(e.currentTarget)
{
case this.mc:
case this.btnShow:
show();
}
break;

鼠标按下时show方法

var view :UIBattleView = new UIBattleView(data);
LayerUtil.I.layerDict[UIBattleView.NAME] = view;
GameConst.main.setStage(view);之后进入战斗图层


  1. package leo.view.ui
  2. {
  3. import flash.display.Bitmap;
  4. import flash.display.BitmapData;
  5. import flash.display.SimpleButton;
  6. import flash.display.Sprite;
  7. import flash.events.Event;
  8. import flash.events.MouseEvent;
  9. import flash.events.TimerEvent;
  10. import flash.utils.Timer;
  11. import ghostcat.manager.SoundManager;
  12. import leo.controller.util.BitmapUtil;
  13. import leo.controller.util.LayerUtil;
  14. import leo.controller.util.PlayerUtil;
  15. import leo.controller.util.RoleManage;
  16. import leo.proxy.GameConst;
  17. import leo.proxy.battles.action.BaseBattleAction;
  18. import leo.proxy.battles.action.IBattleAction;
  19. import leo.proxy.battles.vo.BattleVO;
  20. import leo.proxy.transmission.LoaderUtil;
  21. import leo.proxy.vo.BaseUI;
  22. import leo.proxy.vo.RoleAssetsVO;
  23. import leo.view.role.MapObject;
  24. /**
  25. * 战斗视图层
  26. * @author Leo
  27. *
  28. */
  29. public class UIBattleView extends Sprite
  30. {
  31. public static const NAME :String = "UIBattleView";
  32. public var battleMap :UIBattleMap;
  33. public var battlePlace :UIBattlePlace;
  34. public var battleRoleLayer :UIBattleRoleLayer;
  35. public var btnStartBattle :SimpleButton;
  36. public var btnExitBattle :SimpleButton;
  37. public var battleVO :BattleVO;
  38. private var timer :Timer;
  39. public function UIBattleView(battleVO :BattleVO)
  40. {
  41. this.battleVO = battleVO;
  42. super();
  43. if(!this.battleVO)
  44. {
  45. return;
  46. }
  47. if(stage)
  48. {
  49. init();
  50. }else
  51. {
  52. addEventListener(Event.ADDED_TO_STAGE,init);
  53. }
  54. }
  55. private function init(e :* = null):void
  56. {
  57. removeEventListener(Event.ADDED_TO_STAGE,init);
  58. this.battleMap = new UIBattleMap(this.battleVO.battleInfoVO.battleMapID);
  59. this.addChild(this.battleMap);
  60. this.battlePlace = new UIBattlePlace();
  61. this.addChild(this.battlePlace);
  62. this.battleRoleLayer = new UIBattleRoleLayer(this.battleVO,battlePlace);
  63. this.addChild(this.battleRoleLayer);
  64. this.btnExitBattle = BitmapUtil.I.getBtnByName("BtnExitBattle");
  65. if(this.btnExitBattle)
  66. {
  67. this.addChild(this.btnExitBattle);
  68. this.btnExitBattle.x = stage.stageWidth - 150;
  69. this.btnExitBattle.y = stage.stageHeight - 70;
  70. }
  71. this.btnStartBattle = BitmapUtil.I.getBtnByName("BtnStartBattle");
  72. if(this.btnStartBattle)
  73. {
  74. this.addChild(this.btnStartBattle);
  75. this.btnStartBattle.x = stage.stageWidth - 250;
  76. this.btnStartBattle.y = stage.stageHeight - 70;
  77. }
  78. this.timer = new Timer(30);
  79. this.timer.addEventListener(TimerEvent.TIMER,timerHandler);
  80. this.timer.start();
  81. addEventListener(MouseEvent.MOUSE_UP,clickHandler);
  82. //播放战斗音乐
  83. PlayerUtil.I.playBattleMusic();
  84. }
  85. private function clickHandler(e :MouseEvent):void
  86. {
  87. switch(e.target)
  88. {
  89. case this.btnExitBattle:
  90. trace("退出战斗");
  91. destroy();
  92. break;
  93. case this.btnStartBattle:
  94. trace("开始战斗");
  95. startBattle();
  96. this.btnStartBattle.visible = false;
  97. break;
  98. }
  99. }
  100. /**
  101. * timer更新显示对象
  102. * @param e
  103. *
  104. */
  105. private function timerHandler(e :TimerEvent):void
  106. {
  107. var list :Vector.<MapObject> = RoleManage.I.roleList;
  108. if(!list || list.length == 0)
  109. {
  110. return;
  111. }
  112. for each(var mapObj :MapObject in list)
  113. {
  114. mapObj.update();
  115. }
  116. PlayerUtil.I.update();
  117. }
  118. /**
  119. * 开始战役
  120. */
  121. private function startBattle():void
  122. {
  123. PlayerUtil.I.playBattle(this.battleVO.actions);
  124. }
  125. /**
  126. * 销毁
  127. *
  128. */
  129. public function destroy():void
  130. {
  131. removeEventListener(MouseEvent.MOUSE_UP,clickHandler);
  132. this.timer.stop();
  133. this.timer.removeEventListener(TimerEvent.TIMER,timerHandler);
  134. this.timer = null;
  135. RoleManage.I.destroyRoleObj();
  136. PlayerUtil.I.resetAction();
  137. delete LayerUtil.I.layerDict[UIBattleView.NAME];
  138. if(this.parent)
  139. {
  140. this.parent.removeChild(this);
  141. }
  142. if(GameConst.main)
  143. {
  144. GameConst.main.show();
  145. }
  146. PlayerUtil.I.stopBattleMusic();
  147. }
  148. }
  149. }

private function startBattle():void{}方法中PlayerUtil.I.playBattle(this.battleVO.actions);
  1. package leo.controller.util
  2. {
  3. import flash.geom.Point;
  4. import ghostcat.manager.SoundManager;
  5. import leo.proxy.battles.action.BaseBattleAction;
  6. import leo.proxy.battles.vo.AddObjectVO;
  7. import leo.view.role.MapObject;
  8. import leo.view.ui.UIBattleResult;
  9. import leo.view.ui.UIBattleView;
  10. /**
  11. * 播放器工具
  12. * @author Leo
  13. *
  14. */
  15. public class PlayerUtil
  16. {
  17. private static var _I :PlayerUtil = null;
  18. /**
  19. * 开始播放
  20. */
  21. private var start :Boolean = false;
  22. /**
  23. * 当前正在播放的动作
  24. */
  25. private var curAction :BaseBattleAction;
  26. /**
  27. * 当前播放的序列
  28. */
  29. private var curIndex :int;
  30. /**
  31. * 需要播放的列表
  32. */
  33. private var actionList :Array;
  34. public function PlayerUtil(prv :PrivateClass)
  35. {
  36. }
  37. /**
  38. * 开始播放战斗
  39. * @param actionList
  40. *
  41. */
  42. public function playBattle(actionList :Array):void
  43. {
  44. if(!actionList || actionList.length == 0)
  45. {
  46. return;
  47. }
  48. this.actionList = actionList;
  49. this.curIndex = 0;
  50. this.start = true;
  51. curAction = actionList[curIndex];
  52. curAction.exec();
  53. }
  54. /**
  55. * 更新播放序列
  56. *
  57. */
  58. public function update ():void
  59. {
  60. if(!start || !this.actionList || this.actionList.length == 0)
  61. {
  62. return;
  63. }
  64. if(curAction.allActionFinish)
  65. {
  66. this.curIndex++;
  67. if(this.curIndex > this.actionList.length - 1)
  68. {
  69. //播放完成,战斗结束
  70. this.start = false;
  71. resetAction();
  72. winOrlose();
  73. return;
  74. }
  75. this.curAction = this.actionList[this.curIndex];
  76. this.curAction.exec();
  77. }
  78. }
  79. /**
  80. * 获取近身攻击后人物返回的点
  81. * @param fireObj
  82. * @return
  83. *
  84. */
  85. public function getGoBackPoint(fireObj :MapObject):Point
  86. {
  87. var battleView :UIBattleView = LayerUtil.I.layerDict[UIBattleView.NAME] as UIBattleView;
  88. var home :Boolean = fireObj.addObjVO.roleType == AddObjectVO.TYPE_HERO ? true : false;
  89. var p :Point = battleView.battlePlace.getPlacePosition(fireObj.addObjVO.place,home);
  90. return p;
  91. }
  92. /**
  93. * 停止战斗音乐
  94. */
  95. public function stopBattleMusic():void
  96. {
  97. //停止战斗音乐
  98. SoundManager.instance.stop("BattleMusic");
  99. }
  100. /**
  101. * 播放战斗音乐
  102. */
  103. public function playBattleMusic():void
  104. {
  105. //停止战斗音乐
  106. SoundManager.instance.play("BattleMusic",-1);
  107. }
  108. /**
  109. * 播放受伤音乐
  110. */
  111. public function playHurtMusic():void
  112. {
  113. SoundManager.instance.play("HurtMusic");
  114. }
  115. /**
  116. * 播放技能效果音乐
  117. */
  118. public function playSkillMusic():void
  119. {
  120. SoundManager.instance.play("SkillMusic");
  121. }
  122. /**
  123. * 重置战斗命令
  124. *
  125. */
  126. public function resetAction():void
  127. {
  128. for each(var baseBattleAction :BaseBattleAction in this.actionList)
  129. {
  130. if(baseBattleAction.allActionFinish)
  131. {
  132. baseBattleAction.allActionFinish = false;
  133. }
  134. if(baseBattleAction.queue)
  135. {
  136. baseBattleAction.queue.halt();
  137. }
  138. }
  139. }
  140. private function winOrlose():void
  141. {
  142. var roleList :Vector.<MapObject> = RoleManage.I.roleList;
  143. var result :Boolean = false;
  144. for each(var mapObj :MapObject in roleList)
  145. {
  146. if(mapObj && mapObj.isAlive)
  147. {
  148. if(mapObj.addObjVO.roleType == AddObjectVO.TYPE_HERO)
  149. {
  150. result = true;
  151. break;
  152. }
  153. }
  154. }
  155. var uiBattleView :UIBattleView = LayerUtil.I.getLayer(UIBattleView.NAME) as UIBattleView;
  156. if(uiBattleView)
  157. {
  158. if(result) //战斗胜利
  159. {
  160. uiBattleView.battleRoleLayer.addChild(new UIBattleResult(true));
  161. }else // 战斗失败
  162. {
  163. uiBattleView.battleRoleLayer.addChild(new UIBattleResult(false));
  164. }
  165. }else
  166. {
  167. trace("PlayerUtil 战斗UI查找出错");
  168. }
  169. }
  170. public static function get I():PlayerUtil
  171. {
  172. if(_I == null)
  173. {
  174. _I = new PlayerUtil(new PrivateClass());
  175. }
  176. return _I;
  177. }
  178. }
  179. }
  180. class PrivateClass{}
private function winOrlose():void{}来获得战斗结果,最后交由
  1. var uiBattleView :UIBattleView = LayerUtil.I.getLayer(UIBattleView.NAME) as UIBattleView;
  2. if(uiBattleView)
  3. {
  4. if(result) //战斗胜利
  5. {
  6. uiBattleView.battleRoleLayer.addChild(new UIBattleResult(true));
  7. }else // 战斗失败
  8. {
  9. uiBattleView.battleRoleLayer.addChild(new UIBattleResult(false));
  10. }
  11. }else
  12. {
  13. trace("PlayerUtil 战斗UI查找出错");
  14. }
上面只是走了一遍基本流程,整个战斗系统相对庞大(这里就不都贴出来了,不是我的作品,开源别人的东西不道德),需要源码的小伙伴私信给我就好。我们看下战斗效果。

好了,这一篇就到这,后面我会考虑讨论下slg(策略战棋--这个是我最喜欢的游戏类型,不过我手头没有战棋游戏源码【其实是有一份的cocos2dx写的,不过作者不知道是谁,所以不好贴出来】,所以我们以我2006年拿到的一份slg类j2me的源码来看,只是个小框架,所以只做讨论,比如游戏相关的寻路呀等等吧,我们后面见)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/955275
推荐阅读
相关标签
  

闽ICP备14008679号