EnemyControl.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { BattleBase } from "../base/BattleBase";
  2. import { BattleEventManager } from "../base/BattleEventManager";
  3. import { BattleEventData_EnemyBorn, BattleEventData_EnemyDie, BattleEventData_EnemyMove, BattleEventData_Over, BattleEventTarget, BattleEventType } from "../base/BattleEventUtil";
  4. import { BattleUtil } from "../data/BattleUtil";
  5. import { BulletData } from "../data/BulletData";
  6. import { EnemyData, EnemyDataPool } from "../data/EnemyData";
  7. import { HeroData } from "../data/HeroData";
  8. import { MapData, PosData,EnemyBornData } from "../data/MapData";
  9. //敌人控制类
  10. export class EnemyControl extends BattleBase{
  11. map:MapData = null
  12. mapPosList:Array<BattleUtil.Vector2> = null
  13. lengthUnit:number
  14. enemyDataList: any;
  15. battleEventManager:BattleEventManager = null
  16. init(){
  17. this.battleEventManager = BattleEventManager.instance
  18. this.map = MapData.GetInstance()
  19. this.mapPosList = this.map.mapPosList
  20. this.lengthUnit = 1//this.map.sizeUnit.length()
  21. this.enemyDataList = this.map.enemyDataList
  22. }
  23. //每次加一帧
  24. update(){
  25. this.map.enemyDataList.sort((a,b)=>{
  26. return b.moveLength - a.moveLength
  27. })
  28. this.map.enemyDataList.forEach(enemy => {
  29. if(this.map.battleEnd) return
  30. //判断是否死亡
  31. if(enemy.life <= 0){
  32. let eventData:BattleEventData_EnemyDie = {
  33. eventType: BattleEventType.EnemyDie,
  34. ID: enemy.ID
  35. }
  36. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  37. // console.log("死亡",enemy.ID)
  38. this.map.removeEnemy(enemy)
  39. return
  40. }
  41. //更新位置
  42. let oldPos = this.mapPosList[enemy.posID]
  43. let newPos = this.mapPosList[enemy.nextPosID]
  44. if(!newPos){
  45. console.log("没有下一个点则表示到达终点 有可能配置出错导致有bug")
  46. this.map.battleEnd = true
  47. this.map.bWin = false
  48. let eventData:BattleEventData_Over = {
  49. eventType: BattleEventType.Over,
  50. bWin: false
  51. }
  52. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  53. return
  54. }
  55. let length = BattleUtil.Vector2.Sub(enemy.position,newPos).length()
  56. //判断方向
  57. let direction = BattleUtil.Vector2.Sub(newPos,enemy.position)
  58. direction.normalize()
  59. direction.multiply(enemy.speedCur)
  60. let moveLenght = direction.length()
  61. //暂时没有近点补偿,不考虑多线路长度不一致问题
  62. enemy.moveLength += moveLenght
  63. //暂不考虑跳跃,只有近点移动
  64. if(length > moveLenght){
  65. enemy.position = BattleUtil.Vector2.Add(enemy.position,direction)
  66. enemy.speedVector = direction
  67. }else{
  68. enemy.posID = enemy.nextPosID
  69. let nextPos = this.mapPosList[enemy.nextPosID]
  70. if(nextPos){
  71. if(this.arePointsCollinear(nextPos,oldPos,newPos)){
  72. enemy.position = BattleUtil.Vector2.Add(enemy.position,direction)
  73. enemy.speedVector = direction
  74. }
  75. else{
  76. let newDirection = BattleUtil.Vector2.Sub(nextPos,newPos)
  77. let subLength = moveLenght - length
  78. enemy.speedVector = BattleUtil.Vector2.Multiply(newDirection,enemy.speedCur)
  79. newDirection.multiply(subLength/this.lengthUnit)
  80. enemy.position = BattleUtil.Vector2.Add(enemy.position,newDirection)
  81. }
  82. }
  83. else{
  84. //没有下一个点则表示到达终点 有可能配置出错导致有bug
  85. console.log("没有下一个点则表示到达终点1")
  86. this.map.battleEnd = true
  87. this.map.bWin = false
  88. let eventData:BattleEventData_Over = {
  89. eventType: BattleEventType.Over,
  90. bWin: false
  91. }
  92. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  93. return
  94. }
  95. }
  96. if(enemy.speedChange){
  97. enemy.speedChange = false
  98. let eventData:BattleEventData_EnemyMove = {
  99. eventType: BattleEventType.EnemyMove,
  100. ID: enemy.ID,
  101. speedVector: enemy.speedVector
  102. }
  103. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  104. }
  105. })
  106. if(this.map.enemyBornMap.has(this.map.curTurn)){
  107. let enemyBornList = this.map.enemyBornMap.get(this.map.curTurn)
  108. enemyBornList.forEach((enemyBornData:EnemyBornData)=>{
  109. let enemy = this.map.addEnemy(enemyBornData.typeID,enemyBornData.level,enemyBornData.roldID,enemyBornData.positionID)
  110. let eventData:BattleEventData_EnemyBorn = {
  111. eventType: BattleEventType.EnemyBorn,
  112. ID: enemy.ID,
  113. typeID: enemy.typeID,
  114. position: enemy.position,
  115. speedVector: enemy.speedVector,
  116. life: enemy.life,
  117. lifeMax: enemy.lifeMax
  118. }
  119. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  120. })
  121. }
  122. }
  123. arePointsCollinear(p1: BattleUtil.Vector2, p2: BattleUtil.Vector2, p3: BattleUtil.Vector2): boolean {
  124. // 使用乘法形式比较斜率是否相等
  125. return (p2.y - p1.y) * (p3.x - p1.x) === (p3.y - p1.y) * (p2.x - p1.x);
  126. }
  127. }