TowerUI.ts 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. import { _decorator, instantiate, Node, Prefab, Size, Tween, tween, UITransform, Vec2, Vec3 ,Animation, EventTouch, Button, sp, Enum, Label, Toggle, Sprite, SpriteFrame, v3, utils} from 'cc';
  2. import { BaseView } from '../../../framework/layer/BaseView';
  3. import { Framework } from '../../../framework/Framework';
  4. import { FrameworkConf } from '../../../framework/config/FrameworkConf';
  5. import { AudioID } from '../../../framework/config/AudioConf';
  6. import { AsyncQueue, NextFunction } from '../../../framework/queue/AsyncQueue';
  7. import { Hero } from './node/Hero';
  8. import { Enemy } from './node/Enemy';
  9. import { Hurt } from './node/Hurt';
  10. import { BattleNodeBase } from './node/BattleNodeBase';
  11. import { BattleControl } from './control/BattleControl';
  12. import { BattleUtil } from './data/BattleUtil';
  13. import { BattleEventManager } from './base/BattleEventManager';
  14. import { BattleEventData_EnemyBorn, BattleEventData_EnemyBuff, BattleEventData_EnemyDie, BattleEventData_EnemyHurt, BattleEventData_EnemyMove, BattleEventData_HeroAction, BattleEventData_HeroAttack, BattleEventData_Over, BattleEventTarget, BattleEventType } from './base/BattleEventUtil';
  15. import { MapConf } from './conf/MapConf';
  16. import { isValid } from 'cc';
  17. import { HeroDataPool } from './data/HeroData';
  18. import { StringUtil } from '../../../framework/util/StringUtil';
  19. import { MaterialUtil } from '../../../framework/util/MaterialUtil';
  20. import { ViewID } from '../../../framework/config/LayerConf';
  21. //地图比例尺 1:70
  22. let mapScale = 72;
  23. let basePoint = {x:-325,y:-70}
  24. let baseOffset = {x:0,y:0}
  25. //地图格子转坐标
  26. let MapDataPosToView = (x:number,y:number) => {
  27. let XX = (x+baseOffset.x) * mapScale + basePoint.x;
  28. let YY = (y+baseOffset.y) * mapScale + basePoint.y;
  29. return new Vec3(XX, YY, 0);
  30. //return new Vec3(x * mapScale + basePoint.x, y * mapScale + basePoint.y, 0);
  31. }
  32. //地图速度转换
  33. let MapDataSpeedToView = (x:number,y:number) => {
  34. let XX = x * mapScale * BattleUtil.FrameRate;
  35. let YY = y * mapScale * BattleUtil.FrameRate;
  36. return new Vec2(XX, YY,);
  37. //return new Vec3(x * mapScale + basePoint.x, y * mapScale + basePoint.y, 0);
  38. }
  39. const { ccclass, property } = _decorator;
  40. export interface PosData {
  41. node: Node,
  42. hero: Node,
  43. bLock: boolean,
  44. posID: number,
  45. pos: Vec3,
  46. posNumber: number
  47. }
  48. @ccclass('TowerUI')
  49. export class TowerUI extends BaseView {
  50. @property({ type: Sprite, tooltip: "地图" })
  51. mapSprite: Sprite = null;
  52. @property({ type: Node, tooltip: "攻击位" })
  53. attackNode: Node = null;
  54. @property({ type: Node, tooltip: "背包位" })
  55. bagNode: Node = null;
  56. @property({ type: Node, tooltip: "减血数字根节点" })
  57. hurtNode: Node = null;
  58. // 攻击位
  59. attackPosList: PosData[] = [];
  60. //根据posID获取做的索引
  61. attackPosMap: Map<number,PosData> = new Map();
  62. //背包位
  63. bagPosList: PosData[] = [];
  64. mapID = 1;
  65. @property({ type: [Prefab], tooltip: "英雄" })
  66. heroModelList: Prefab[] = [];
  67. heroPool: Map<number,Node[]> = new Map();
  68. heroList: Node[] = [];
  69. @property({type:[Node],tooltip:"升级效果"})
  70. levelUpEffect:Node[] = []
  71. @property({ type: [Prefab], tooltip: "敌人" })
  72. ememyModelList: Prefab[] = [];
  73. enemyPool: Node[] = [];
  74. enemyMap: Map<number,Node> = new Map();
  75. enemyWaitTime: number = 0;
  76. @property({ type: [Prefab], tooltip: "受伤数字" })
  77. hurtModelList: Prefab[] = [];
  78. hurtPool: Node[] = [];
  79. hurtList: Node[] = [];
  80. @property({ type:Node, tooltip: "所有角色根节点" })
  81. roleNode: Node = null;
  82. @property({ type:Node, tooltip: "攻击范围" })
  83. radiusNode: Node = null;
  84. @property({ type:[Node], tooltip: "统计节点" })
  85. countList: Node[] = [];
  86. @property({ type: Label, tooltip: "精力统计" })
  87. powerLabel: Label = null;
  88. bStart = false;
  89. waitTime = 5;
  90. touchStart: Node = null;
  91. gameTime = 0;
  92. //当前精力
  93. private powerCur = 180;
  94. //最大精力
  95. private powerMax = 180
  96. //伤害统计 key:typeID value:伤害值
  97. private damageCountData:Map<number,number> = new Map();
  98. private damageUpdateTime = 0;
  99. battleControl: BattleControl = null;
  100. //当前动画下标
  101. levelUpEffectIndex = 0;
  102. //是否自动合成
  103. isAutoMerge = true;
  104. protected onLoad() {
  105. super.onLoad();
  106. this.node.on(Node.EventType.TOUCH_START, this.onTouchStart, this)
  107. this.node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
  108. this.node.on(Node.EventType.TOUCH_END, this.onTouchEnd, this);
  109. this.node.on(Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);
  110. for (let i = 0; i < this.levelUpEffect.length; i++) {
  111. this.levelUpEffect[i].getComponent(sp.Skeleton).setCompleteListener(()=>{
  112. this.levelUpEffect[i].active = false;
  113. })
  114. }
  115. this.battleControl = BattleControl.GetInstance()
  116. BattleEventManager.instance.addEvent(BattleEventTarget.Update, this.updateDataEvent.bind(this), -1);
  117. this.initPool()
  118. }
  119. protected start(): void {
  120. this.battleControl.init(this.mapID)
  121. this.init();
  122. }
  123. protected onDestroy() {
  124. }
  125. protected update(dt: number): void {
  126. this.updateSiblingIndex()
  127. if(this.bStart){
  128. this.gameTime += dt;
  129. let nowFrame = Math.floor(this.gameTime/BattleUtil.FrameTime)
  130. if(nowFrame > this.battleControl.map.curTurn){
  131. //
  132. while(nowFrame > this.battleControl.map.curTurn+1){
  133. //需要移动的对象做瞬时计算 //目前只有敌人,以后会有子弹或者其他会移动的
  134. this.enemyMap.forEach(element => {
  135. element.getComponent(Enemy).battleUpdate(BattleUtil.FrameTime)
  136. });
  137. this.battleControl.update();
  138. if(this.battleControl.isBattleEnd){
  139. break;
  140. }
  141. }
  142. this.enemyMap.forEach(element => {
  143. element.getComponent(Enemy).battleUpdate(BattleUtil.FrameTime)
  144. });
  145. this.battleControl.update();
  146. }
  147. this.damageUpdateTime += dt;
  148. if(this.damageUpdateTime > 0.1){
  149. this.damageUpdateTime = 0;
  150. this.updateDamageCount()
  151. }
  152. }
  153. else{
  154. if(this.waitTime > 0){
  155. this.waitTime -= dt;
  156. }
  157. else{
  158. this.bStart = true;
  159. }
  160. }
  161. }
  162. private updateDataEvent(event){
  163. if(this.battleControl.isBattleEnd && event.eventType!=BattleEventType.Over){
  164. console.log("结束")
  165. return
  166. }
  167. switch(event.eventType){
  168. case BattleEventType.EnemyBorn:{
  169. let enemyData = event as BattleEventData_EnemyBorn;
  170. this.addEnemy(enemyData);
  171. break;
  172. }
  173. case BattleEventType.EnemyMove:{
  174. let enemyData = event as BattleEventData_EnemyMove;
  175. // console.log("移动",enemyData.ID,enemyData.speedVector.x,enemyData.speedVector.y)
  176. if(this.enemyMap.has(enemyData.ID)){
  177. let enemy = this.enemyMap.get(enemyData.ID);
  178. enemy.getComponent(Enemy).speedVector = MapDataSpeedToView(enemyData.speedVector.x, enemyData.speedVector.y);
  179. }
  180. break;
  181. }
  182. case BattleEventType.EnemyHurt:{
  183. let enemyData = event as BattleEventData_EnemyHurt;
  184. //console.log("移动",enemyData.ID,enemyData.hurt,enemyData.status)
  185. if(this.enemyMap.has(enemyData.targetID)){
  186. let enemy = this.enemyMap.get(enemyData.targetID);
  187. enemy.getComponent(Enemy).hurt(enemyData.hurt);
  188. this.addHurt(enemy.position,enemyData.hurt)
  189. }
  190. this.setDamageCount(enemyData.typeID,enemyData.hurt)
  191. break;
  192. }
  193. case BattleEventType.EnemyDie:{
  194. // console.log("死亡",event)
  195. let enemyData = event as BattleEventData_EnemyDie;
  196. if(this.enemyMap.has(enemyData.ID)){
  197. let enemy = this.enemyMap.get(enemyData.ID);
  198. enemy.getComponent(Enemy).die(()=>{
  199. this.enemyMap.delete(enemyData.ID);
  200. this.enemyPool.push(enemy);
  201. }
  202. );
  203. }
  204. break;
  205. }
  206. case BattleEventType.EnemyBuff:{
  207. let enemyData = event as BattleEventData_EnemyBuff;
  208. if(this.enemyMap.has(enemyData.ID)){
  209. let enemy = this.enemyMap.get(enemyData.ID);
  210. //enemy.getComponent(Enemy).addbuff(enemyData.buff);
  211. }
  212. break;
  213. }
  214. case BattleEventType.HeroAction:{
  215. // console.log("攻击动作",event)
  216. let attackData = event as BattleEventData_HeroAction;
  217. if(this.attackPosMap.has(attackData.posID)){
  218. let posData = this.attackPosMap.get(attackData.posID);
  219. let enemy = this.enemyMap.get(attackData.targetID);
  220. if( posData && posData.hero){
  221. let hero = posData.hero.getComponent(Hero);
  222. if(enemy){
  223. hero.attack(enemy)
  224. // enemy.getComponent(Enemy).hurt(attackData.hurt);
  225. // this.addHurt(enemy.position,attackData.hurt)
  226. }
  227. else{
  228. hero.stand()
  229. }
  230. // this.setDamageCount(hero.typeID,attackData.hurt)
  231. }
  232. }
  233. break;
  234. }
  235. case BattleEventType.HeroAttack:{
  236. console.log("攻击",event)
  237. let attackData = event as BattleEventData_HeroAttack;
  238. if(this.attackPosMap.has(attackData.posID)){
  239. let posData = this.attackPosMap.get(attackData.posID);
  240. let enemy = this.enemyMap.get(attackData.targetID);
  241. if( posData && posData.hero){
  242. let hero = posData.hero.getComponent(Hero);
  243. if(enemy){
  244. // hero.attack(enemy)
  245. enemy.getComponent(Enemy).hurt(attackData.hurt);
  246. this.addHurt(enemy.position,attackData.hurt)
  247. this.setDamageCount(hero.typeID,attackData.hurt)
  248. }
  249. // else{
  250. // hero.stand()
  251. // }
  252. }
  253. }
  254. break;
  255. }
  256. case BattleEventType.Over:{
  257. let attackData = event as BattleEventData_Over;
  258. this.attackPosMap.forEach((posData, posID) => {
  259. if(posData.hero){
  260. posData.hero.getComponent(Hero).stand()
  261. }
  262. })
  263. this.enemyMap.forEach((enemy, enemyID) => {
  264. enemy.getComponent(Enemy).stand()
  265. })
  266. let winStr = attackData.bWin ? "胜利" : "失败";
  267. console.log(winStr)
  268. tween(this.node).delay(3).call(()=>{
  269. this.enemyMap.forEach((enemy, enemyID) => {
  270. enemy.getComponent(Enemy).clearData();
  271. this.enemyMap.delete(enemyID);
  272. this.enemyPool.push(enemy);
  273. })
  274. this.mapID = this.mapID %2+1;
  275. this.battleControl.reset(this.mapID)
  276. this.reset()
  277. for(let index = 0; index < this.attackPosList.length; index++){
  278. let hero = this.attackPosList[index].hero;
  279. if(hero){
  280. hero.position = this.attackPosList[index].pos;
  281. let heroObj = hero.getComponent(Hero)
  282. this.battleControl.addHeroInPos(heroObj.typeID,heroObj.level,index)
  283. }
  284. }
  285. }).start();
  286. break;
  287. }
  288. }
  289. }
  290. onTouchStart(event: EventTouch) {
  291. if (this.touchStart) {
  292. this.resetHeroPos(this.touchStart)
  293. }
  294. // 获取触点对应节点
  295. let posData = this.getItemBaseByPosition(event.getLocation());
  296. if(posData && posData.hero){
  297. let hero = posData.hero.getComponent(Hero);
  298. if(hero.isLock){
  299. return;
  300. }
  301. Framework.audio.playEffect(AudioID.Click);
  302. this.touchStart = posData.hero;
  303. hero.stand()
  304. this.touchStart.setSiblingIndex(30);
  305. let index = posData.posID - BattleUtil.BagListSize
  306. if(index >= 0){
  307. this.battleControl.removeHeroInPos(index)
  308. }
  309. }
  310. }
  311. // 触摸移动
  312. onTouchMove(event: EventTouch) {
  313. if (this.touchStart ) {
  314. this.touchStart .setPosition(this.roleNode.getComponent(UITransform).convertToNodeSpaceAR(new Vec3(event.getUILocation().x, event.getUILocation().y)))
  315. let posData = this.getItemBaseByPosition(event.getLocation());
  316. if(posData&&(posData.posID >= BattleUtil.BagListSize)){
  317. this.radiusNode.position = v3(this.touchStart.position.x,this.touchStart.position.y);
  318. this.radiusNode.active = true;
  319. this.setRadius(this.touchStart.getComponent(Hero).radius)
  320. }
  321. else{
  322. this.radiusNode.active = false;
  323. }
  324. }
  325. else{
  326. this.radiusNode.active = false;
  327. }
  328. }
  329. onTouchEnd(event: EventTouch) {
  330. this.radiusNode.active = false;
  331. if (this.touchStart) {
  332. let posData = this.getItemBaseByPosition(event.getLocation());
  333. let touchEnd:Node = null
  334. if(posData && posData.hero != this.touchStart){
  335. if(posData.hero){
  336. let hero = posData.hero.getComponent(Hero);
  337. if(hero && hero.isLock){
  338. this.resetHeroPos(this.touchStart)
  339. this.touchStart = null;
  340. return;
  341. }
  342. }
  343. touchEnd = posData.hero;
  344. }
  345. else{
  346. this.resetHeroPos(this.touchStart)
  347. this.touchStart = null;
  348. return
  349. }
  350. if(touchEnd){
  351. let endHero = touchEnd.getComponent(Hero)
  352. let startHero = this.touchStart.getComponent(Hero)
  353. if(endHero.typeID == startHero.typeID && endHero.level == startHero.level){
  354. this.mergeHero(this.touchStart, touchEnd)
  355. }
  356. else{
  357. this.changeHeroPos(this.touchStart, touchEnd)
  358. }
  359. }
  360. else{
  361. this.setHeroPos(this.touchStart, posData.posID)
  362. }
  363. this.touchStart = null;
  364. }
  365. }
  366. onTouchCancel(event: EventTouch) {
  367. this.radiusNode.active = false;
  368. if (this.touchStart) {
  369. this.resetHeroPos(this.touchStart)
  370. this.touchStart = null;
  371. }
  372. }
  373. //根据世界坐标获取item 排除手上的
  374. private getItemBaseByPosition(pos: Vec2):PosData {
  375. let FindArr = this.bagPosList
  376. let bag = FindArr.find(t => {
  377. if(t.hero && t.hero != this.touchStart){
  378. return t.hero.getComponent(Hero).hitTest(pos)
  379. }
  380. return t.node.getComponent(UITransform).hitTest(pos)
  381. });
  382. if (bag ) return bag
  383. FindArr = this.attackPosList
  384. let attack = FindArr.find(t => {
  385. if(t.hero && t.hero != this.touchStart){
  386. return t.hero.getComponent(Hero).hitTest(pos)
  387. }
  388. return t.node.getComponent(UITransform).hitTest(pos)
  389. });
  390. return attack;
  391. }
  392. //炸弹效果播放结束
  393. bombSpineOver() {
  394. }
  395. //UI开打时会调用,如果有初始化代码应该放到此函数
  396. onOpen(args) {
  397. }
  398. //UI关闭时会调用,该函数在onDestroy前调用
  399. onClose() {
  400. }
  401. //框架管理UI层级时会调用,可根据UI情况修改
  402. onShow() {
  403. super.onShow();
  404. }
  405. //框架管理UI层级时会调用,可根据UI情况修改
  406. onHide() {
  407. super.onHide();
  408. }
  409. init() {
  410. this.bStart = false;
  411. this.waitTime = 5;
  412. this.gameTime = 0;
  413. this.radiusNode.active = false;
  414. let posID = 0;
  415. let roleTransform = this.roleNode.getComponent(UITransform)
  416. let mapConf = MapConf.data[this.mapID.toString()]
  417. if(!mapConf){
  418. console.log("地图配置错误")
  419. return
  420. }
  421. let offset = mapConf.OffsetArray
  422. if(offset){
  423. baseOffset.x = offset[0]
  424. baseOffset.y = offset[1]
  425. }
  426. else{
  427. baseOffset.x = 0
  428. baseOffset.y = 0
  429. }
  430. let path = "texture/tower/"+mapConf.Background+"/spriteFrame"
  431. this.load("package",path, SpriteFrame, (res: SpriteFrame) => {
  432. this.mapSprite.spriteFrame = res
  433. })
  434. let bagChildren = this.bagNode.children
  435. for (let i = 0; i < BattleUtil.BagListSize; i++) {
  436. let node = bagChildren[i];
  437. let pos = roleTransform.convertToNodeSpaceAR(node.getWorldPosition())
  438. let posData: PosData = {
  439. node: node,
  440. hero: null,
  441. bLock: false,
  442. posID: posID,
  443. pos: pos,
  444. posNumber: -1
  445. }
  446. this.bagPosList.push(posData);
  447. posID++;
  448. }
  449. let attackChildren = this.attackNode.children
  450. for (let i = 0; i < attackChildren.length; i++) {
  451. let node = attackChildren[i];
  452. let posNumber = this.battleControl.getPosIDByIndex(i)
  453. if(posNumber != -1){
  454. node.active = true;
  455. let mapDataPos = this.battleControl.getPosition(posNumber)
  456. let posXX = MapDataPosToView(mapDataPos.x,mapDataPos.y)
  457. node.position = posXX
  458. let posData: PosData = {
  459. node: node,
  460. hero: null,
  461. bLock: false,
  462. posID: posID,
  463. pos: new Vec3(posXX.x, posXX.y, 0),
  464. posNumber: posNumber
  465. }
  466. this.attackPosList.push(posData);
  467. this.attackPosMap.set(posNumber, posData);
  468. posID++;
  469. }
  470. else {
  471. node.active = false;
  472. }
  473. }
  474. }
  475. reset(){
  476. let mapConf = MapConf.data[this.mapID.toString()]
  477. if(!mapConf){
  478. console.log("地图配置错误")
  479. return
  480. }
  481. let offset = mapConf.OffsetArray
  482. if(offset){
  483. baseOffset.x = offset[0]
  484. baseOffset.y = offset[1]
  485. }
  486. else{
  487. baseOffset.x = 0
  488. baseOffset.y = 0
  489. }
  490. let attackChildren = this.attackNode.children
  491. for (let i = 0; i < attackChildren.length; i++) {
  492. let node = attackChildren[i];
  493. let posNumber = this.battleControl.getPosIDByIndex(i)
  494. if(posNumber != -1){
  495. node.active = true;
  496. let mapDataPos = this.battleControl.getPosition(posNumber)
  497. let posXX = MapDataPosToView(mapDataPos.x,mapDataPos.y)
  498. node.position = posXX
  499. let posData: PosData = this.attackPosList[i]
  500. if(!posData){
  501. posData = {
  502. node: node,
  503. hero: null,
  504. bLock: false,
  505. posID: BattleUtil.BagListSize+i,
  506. pos: new Vec3(posXX.x, posXX.y, 0),
  507. posNumber: posNumber
  508. }
  509. this.attackPosList.push(posData);
  510. }
  511. else{
  512. posData.posID = BattleUtil.BagListSize+i;
  513. posData.pos = new Vec3(posXX.x, posXX.y, 0);
  514. posData.posNumber = posNumber;
  515. if(posData.hero){
  516. posData.hero.position = posData.pos;
  517. }
  518. }
  519. this.attackPosMap.set(posNumber, posData);
  520. }
  521. else {
  522. node.active = false;
  523. }
  524. }
  525. let path = "texture/tower/"+mapConf.Background+"/spriteFrame"
  526. this.load("package",path, SpriteFrame, (res: SpriteFrame) => {
  527. this.mapSprite.spriteFrame = res
  528. })
  529. this.bStart = false;
  530. this.waitTime = 5;
  531. this.gameTime = 0;
  532. this.radiusNode.active = false;
  533. this.damageCountData.clear()
  534. this.updateDamageCount()
  535. }
  536. private initPool() {
  537. //初始化池
  538. let queue = new AsyncQueue();
  539. queue.pushMulti("InitPool", async (next: NextFunction, params: any, args: any) => {
  540. Framework.tips.setTipsNode("package", "prefab/ui/tips/tips_flash", "Label", () => {
  541. next && next();
  542. });
  543. });
  544. queue.complete = () => {
  545. //this._loginEx();
  546. };
  547. queue.play();
  548. //this._loginEx();
  549. }
  550. addHero() {
  551. let posID = -1;
  552. if(this.powerCur <= 0){
  553. console.log("没有精力了");
  554. return;
  555. }
  556. for (let i = 0; i < BattleUtil.BagListSize; i++) {
  557. if(this.bagPosList[i].hero == null){
  558. posID = this.bagPosList[i].posID;
  559. break;
  560. }
  561. }
  562. if(posID == -1) {
  563. console.log("没有空位了");
  564. return;
  565. }
  566. //添加英雄
  567. let heroID = Math.floor(Math.random() * this.heroModelList.length)%this.heroModelList.length + 1;
  568. let heroData = HeroDataPool.getObject();
  569. heroData.init(heroID,1,posID)
  570. let node:Node = null;
  571. if(this.heroPool[heroID] == null){
  572. this.heroPool[heroID] = [];
  573. }
  574. else {
  575. if(this.heroPool[heroID].length > 0){
  576. node = this.heroPool[heroID].pop();
  577. }
  578. }
  579. if(node == null){
  580. node = instantiate(this.heroModelList[heroID-1]);
  581. node.parent = this.roleNode;
  582. this.heroList.push(node);
  583. }
  584. let hero = node.getComponent(Hero);
  585. hero.resetData(heroData);
  586. HeroDataPool.putObject(heroData);
  587. hero.posID = posID;
  588. let posData = this.bagPosList[posID];
  589. if(!posData){
  590. return;
  591. }
  592. posData.hero = node;
  593. node.position = posData.pos;
  594. console.log("添加英雄", node.position);
  595. this.powerLabel.string = `${this.powerCur}/${this.powerMax}`;
  596. this.powerCur--;
  597. this.checkMerge(node);
  598. }
  599. checkMerge(node:Node) {
  600. let hero = node.getComponent(Hero);
  601. if(!hero) {
  602. return;
  603. }
  604. let bFind = false;
  605. if(this.isAutoMerge && !hero.isLock && hero.posID < BattleUtil.BagListSize){
  606. for (let i = 0; i < this.attackPosList.length; i++) {
  607. let dstPosData = this.attackPosList[i];
  608. if(dstPosData.hero != null && dstPosData.hero != node){
  609. let dstHero = dstPosData.hero.getComponent(Hero);
  610. if((!dstHero.isLock) && dstHero.typeID == hero.typeID && dstHero.level == hero.level){
  611. if(this.mergeHero(node, dstPosData.hero)){
  612. bFind = true;
  613. break;
  614. }
  615. }
  616. }
  617. }
  618. if(!bFind){
  619. for (let i = 0; i < BattleUtil.BagListSize; i++) {
  620. let dstPosData = this.bagPosList[i];
  621. if(dstPosData.hero != null && dstPosData.hero != node){
  622. let dstHero = dstPosData.hero.getComponent(Hero);
  623. if((!dstHero.isLock) && dstHero.typeID == hero.typeID && dstHero.level == hero.level){
  624. if(this.mergeHero(node, dstPosData.hero))
  625. break;
  626. }
  627. }
  628. }
  629. }
  630. }
  631. }
  632. //合并英雄
  633. mergeHero(srcNode:Node, dstNode:Node) {
  634. let dstHero = dstNode.getComponent(Hero);
  635. if(dstHero.isLock){
  636. return false;
  637. }
  638. dstHero.isLock = true;
  639. // srcNode.setSiblingIndex(BattleUtil.BagListSize+this.attackPosList.length)
  640. srcNode.getComponent(Hero).flyTo(dstNode.position,()=>{
  641. if(isValid(dstHero)){
  642. dstHero.isLock = false;
  643. dstHero.levelUp()
  644. if(dstHero.posID >= BattleUtil.BagListSize){
  645. let index = dstHero.posID - BattleUtil.BagListSize;
  646. this.battleControl.levelUp(index)
  647. }
  648. this.levelUpEffectIndex = this.levelUpEffectIndex++%this.levelUpEffect.length;
  649. this.levelUpEffect[this.levelUpEffectIndex].position = dstNode.position
  650. this.levelUpEffect[this.levelUpEffectIndex].active = true
  651. this.levelUpEffect[this.levelUpEffectIndex].getComponent(sp.Skeleton).setAnimation(0, "animation", false)
  652. this.removeHeroPos(srcNode)
  653. this.checkMerge(dstNode)
  654. }
  655. })
  656. return true;
  657. }
  658. addEnemy(eventData: BattleEventData_EnemyBorn) {
  659. //添加敌人
  660. let node:Node = null;
  661. if(this.enemyPool.length > 0){
  662. node = this.enemyPool.pop();
  663. }
  664. else {
  665. node = instantiate(this.ememyModelList[0]);
  666. node.parent = this.roleNode;
  667. }
  668. node.setSiblingIndex(0)
  669. node.getComponent(Enemy).resetData(eventData.typeID,eventData.ID,MapDataPosToView(eventData.position.x,eventData.position.y),eventData.life,eventData.lifeMax)
  670. node.getComponent(Enemy).startMove("move1")
  671. this.enemyMap.set(eventData.ID,node);
  672. }
  673. onClickStart() {
  674. this.bStart = true;
  675. }
  676. onClickStop() {
  677. this.bStart = false;
  678. }
  679. onClickAddHero() {
  680. Framework.audio.playEffect(AudioID.Click);
  681. this.addHero();
  682. }
  683. //重置坐标
  684. resetHeroPos(heroNode:Node) {
  685. let hero = heroNode.getComponent(Hero)
  686. if(!hero) {
  687. return;
  688. }
  689. let posID = hero.posID;
  690. if(posID != -1){
  691. if(posID < BattleUtil.BagListSize)
  692. heroNode.position = this.bagPosList[posID].pos;
  693. else if(posID < BattleUtil.BagListSize + this.attackPosList.length){
  694. heroNode.position = this.attackPosList[posID - BattleUtil.BagListSize].pos;
  695. this.battleControl.addHeroInPos(hero.typeID,hero.level,posID - BattleUtil.BagListSize)
  696. }
  697. }
  698. }
  699. //设置新坐标
  700. setHeroPos(hero:Node,newPosID:number) {
  701. let posID = hero.getComponent(Hero).posID;
  702. if(posID != -1){
  703. if(posID < BattleUtil.BagListSize)
  704. this.bagPosList[posID].hero = null;
  705. else if(posID < BattleUtil.BagListSize + this.attackPosList.length){
  706. this.attackPosList[posID - BattleUtil.BagListSize].hero = null;
  707. }
  708. }
  709. if(newPosID != -1){
  710. if(newPosID < BattleUtil.BagListSize){
  711. this.bagPosList[newPosID].hero = hero;
  712. hero.position = this.bagPosList[newPosID].pos;
  713. }
  714. else if(newPosID < BattleUtil.BagListSize + this.attackPosList.length){
  715. let index = newPosID - BattleUtil.BagListSize;
  716. this.attackPosList[index].hero = hero;
  717. hero.position = this.attackPosList[index].pos;
  718. let heroObj = hero.getComponent(Hero)
  719. this.battleControl.addHeroInPos(heroObj.typeID,heroObj.level,index)
  720. }
  721. hero.getComponent(Hero).posID = newPosID
  722. }
  723. }
  724. removeHeroPos(hero:Node) {
  725. let posID = hero.getComponent(Hero).posID;
  726. if(posID != -1){
  727. this.heroList.splice(this.heroList.indexOf(hero), 1)
  728. this.heroPool[hero.getComponent(Hero).typeID].push(hero)
  729. hero.getComponent(Hero).clearData();
  730. if(posID < BattleUtil.BagListSize)
  731. this.bagPosList[posID].hero = null;
  732. else if(posID < BattleUtil.BagListSize + this.attackPosList.length){
  733. this.attackPosList[posID - BattleUtil.BagListSize].hero = null;
  734. this.battleControl.removeHeroInPos(posID - BattleUtil.BagListSize)
  735. }
  736. }
  737. }
  738. changeHeroPos(hero1:Node,hero2:Node) {
  739. let posID1 = hero1.getComponent(Hero).posID;
  740. let posID2 = hero2.getComponent(Hero).posID;
  741. hero1.getComponent(Hero).posID = posID2
  742. hero2.getComponent(Hero).posID = posID1
  743. if(posID1 != -1){
  744. if(posID1 < BattleUtil.BagListSize){
  745. hero2.position = this.bagPosList[posID1].pos;
  746. this.bagPosList[posID1].hero = hero2;
  747. }
  748. else if(posID1 < BattleUtil.BagListSize + this.attackPosList.length){
  749. hero2.position = this.attackPosList[posID1 - BattleUtil.BagListSize].pos;
  750. let index = posID1 - BattleUtil.BagListSize;
  751. this.attackPosList[index].hero = hero2;
  752. let heroObj = hero2.getComponent(Hero)
  753. this.battleControl.addHeroInPos(heroObj.typeID,heroObj.level,index)
  754. }
  755. hero2.getComponent(Hero).stand()
  756. }
  757. if(posID2 != -1){
  758. if(posID2 < BattleUtil.BagListSize){
  759. hero1.position = this.bagPosList[posID2].pos;
  760. this.bagPosList[posID2].hero = hero1;
  761. }
  762. else if(posID2 < BattleUtil.BagListSize + this.attackPosList.length){
  763. hero1.position = this.attackPosList[posID2 - BattleUtil.BagListSize].pos;
  764. let index = posID2 - BattleUtil.BagListSize;
  765. this.attackPosList[index].hero = hero1;
  766. let heroObj = hero1.getComponent(Hero)
  767. this.battleControl.addHeroInPos(heroObj.typeID,heroObj.level,index)
  768. }
  769. hero1.getComponent(Hero).stand()
  770. }
  771. }
  772. addHurt(pos:Vec3,value:number){
  773. console.log("addHurt",value)
  774. let node:Node = null;
  775. if(this.hurtPool.length > 0){
  776. node = this.hurtPool.pop();
  777. }
  778. else {
  779. node = instantiate(this.hurtModelList[0]);
  780. node.parent = this.roleNode;
  781. }
  782. node.position = pos;
  783. this.hurtList.push(node);
  784. node.getComponent(Hurt).hurt(value,()=>{
  785. this.hurtList.splice(this.hurtList.indexOf(node), 1)
  786. this.hurtPool.push(node)
  787. })
  788. }
  789. updateSiblingIndex() {
  790. let children = this.roleNode.children
  791. children.sort((a, b) => {
  792. let battleNodeA = a.getComponent(BattleNodeBase);
  793. let battleNodeB = b.getComponent(BattleNodeBase);
  794. if (!battleNodeA || !battleNodeB) {
  795. return 0;
  796. }
  797. let priorityA = battleNodeA.priority
  798. let priorityB = battleNodeB.priority
  799. if (priorityA != priorityB) {
  800. return priorityA - priorityB;
  801. }
  802. if(this.touchStart == b){
  803. return -1;
  804. }
  805. if(this.touchStart == a){
  806. return 1;
  807. }
  808. //特殊状态
  809. if(battleNodeB.isLock){
  810. return -1;
  811. }
  812. if(battleNodeA.isLock){
  813. return 1;
  814. }
  815. if (a.position.y != b.position.y) {
  816. return b.position.y - a.position.y;
  817. }
  818. else {
  819. a.position.x - b.position.x
  820. }
  821. });
  822. for (let i = 0; i < children.length; i++) {
  823. children[i].setSiblingIndex(i);
  824. }
  825. }
  826. setRadius(radius:number){
  827. this.radiusNode.scale = v3(0.4*radius,0.4*radius,1)
  828. }
  829. updateDamageCount(){
  830. let num = 0
  831. this.damageCountData.forEach((value,typeID)=>{
  832. let countNode = this.countList[num]
  833. if(num < this.countList.length){
  834. this.countList[num].active = true
  835. }
  836. if(countNode){
  837. let headSprite = countNode.getChildByName("head").getComponent(Sprite)
  838. let valueLabel = countNode.getChildByName("number")
  839. let progress = countNode.getChildByName("progress").getComponent(UITransform)
  840. MaterialUtil.getHeadByID(typeID,headSprite)
  841. //headSprite.getComponent(Sprite).spriteFrame = this.headSprite[typeID]
  842. valueLabel.getComponent(Label).string = StringUtil.bigNumberToStr(value)
  843. let progressWidth = value/100*84
  844. if(progressWidth > 84){
  845. progressWidth = 84
  846. }
  847. progress.setContentSize(progressWidth,20)
  848. }
  849. num++
  850. })
  851. for(let i = num;i<this.countList.length;i++){
  852. this.countList[i].active = false
  853. }
  854. }
  855. setDamageCount(typeID:number,value:number){
  856. let valueOld = this.damageCountData.get(typeID) || 0
  857. this.damageCountData.set(typeID,value+valueOld)
  858. }
  859. //UI事件处理
  860. private onTouchButton(event: Event) {
  861. let target: any = event.target;
  862. if (target.name == 'addHero-004') {
  863. Framework.layer.open(ViewID.MailMain)
  864. }
  865. }
  866. }