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