TowerUI.ts 24 KB

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