EnemyControl.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. typeID: enemy.typeID,
  35. ID: enemy.ID
  36. }
  37. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  38. // console.log("死亡",enemy.ID)
  39. this.map.removeEnemy(enemy)
  40. return
  41. }
  42. //更新位置
  43. let oldPos = this.mapPosList[enemy.posID]
  44. let newPos = this.mapPosList[enemy.nextPosID]
  45. if(!newPos){
  46. console.log("没有下一个点则表示到达终点 有可能配置出错导致有bug")
  47. this.map.battleEnd = true
  48. this.map.bWin = false
  49. let eventData:BattleEventData_Over = {
  50. eventType: BattleEventType.Over,
  51. bWin: false
  52. }
  53. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  54. return
  55. }
  56. let length = BattleUtil.Vector2.Sub(enemy.position,newPos).length()
  57. //判断方向
  58. let direction = BattleUtil.Vector2.Sub(newPos,enemy.position)
  59. direction.normalize()
  60. direction.multiply(enemy.speedCur)
  61. let moveLenght = direction.length()
  62. //暂时没有近点补偿,不考虑多线路长度不一致问题
  63. enemy.moveLength += moveLenght
  64. //暂不考虑跳跃,只有近点移动
  65. if(length > moveLenght){
  66. enemy.position = BattleUtil.Vector2.Add(enemy.position,direction)
  67. enemy.speedVector = direction
  68. }else{
  69. enemy.posID = enemy.nextPosID
  70. let nextPos = this.mapPosList[enemy.nextPosID]
  71. if(nextPos){
  72. if(this.arePointsCollinear(nextPos,oldPos,newPos)){
  73. enemy.position = BattleUtil.Vector2.Add(enemy.position,direction)
  74. enemy.speedVector = direction
  75. }
  76. else{
  77. let newDirection = BattleUtil.Vector2.Sub(nextPos,newPos)
  78. let subLength = moveLenght - length
  79. enemy.speedVector = BattleUtil.Vector2.Multiply(newDirection,enemy.speedCur)
  80. newDirection.multiply(subLength/this.lengthUnit)
  81. enemy.position = BattleUtil.Vector2.Add(enemy.position,newDirection)
  82. }
  83. }
  84. else{
  85. //没有下一个点则表示到达终点 有可能配置出错导致有bug
  86. console.log("没有下一个点则表示到达终点1")
  87. this.map.battleEnd = true
  88. this.map.bWin = false
  89. let eventData:BattleEventData_Over = {
  90. eventType: BattleEventType.Over,
  91. bWin: false
  92. }
  93. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  94. return
  95. }
  96. }
  97. if(enemy.speedChange){
  98. enemy.speedChange = false
  99. let eventData:BattleEventData_EnemyMove = {
  100. eventType: BattleEventType.EnemyMove,
  101. ID: enemy.ID,
  102. speedVector: enemy.speedVector
  103. }
  104. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  105. }
  106. })
  107. if(this.map.enemyBornMap.has(this.map.curTurn)){
  108. let enemyBornList = this.map.enemyBornMap.get(this.map.curTurn)
  109. enemyBornList.forEach((enemyBornData:EnemyBornData)=>{
  110. let enemy = this.map.addEnemy(enemyBornData.typeID,enemyBornData.level,enemyBornData.roldID,enemyBornData.positionID)
  111. let eventData:BattleEventData_EnemyBorn = {
  112. eventType: BattleEventType.EnemyBorn,
  113. ID: enemy.ID,
  114. typeID: enemy.typeID,
  115. position: enemy.position,
  116. speedVector: enemy.speedVector,
  117. life: enemy.life,
  118. lifeMax: enemy.lifeMax
  119. }
  120. this.battleEventManager.fireEvent(BattleEventTarget.Update,eventData)
  121. })
  122. }
  123. }
  124. arePointsCollinear(p1: BattleUtil.Vector2, p2: BattleUtil.Vector2, p3: BattleUtil.Vector2): boolean {
  125. // 使用乘法形式比较斜率是否相等
  126. return (p2.y - p1.y) * (p3.x - p1.x) === (p3.y - p1.y) * (p2.x - p1.x);
  127. }
  128. }