ZombieMapData.ts 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. import { BattleUtil } from "../../tower/data/BattleUtil";
  2. import { DataBase } from "../../tower/data/DataBase";
  3. import { EnemyBornData, MapData, PosData } from "../../tower/data/MapData";
  4. import { ZombieMapConf } from "../conf/ZombieMapConf";
  5. import { ZombieBuffData, ZombieBuffDataPool } from "./ZombieBuffData";
  6. import { ZombieBulletData, ZombieBulletDataPool } from "./ZombieBulletData";
  7. import { ZombieEnemyData, ZombieEnemyDataPool } from "./ZombieEnemyData";
  8. import { ZombieHeroData, ZombieHeroDataPool } from "./ZombieHeroData";
  9. //地图格子 单例
  10. export class ZombieMapData extends MapData {
  11. protected static instance:ZombieMapData;
  12. static GetInstance():ZombieMapData{
  13. if(!ZombieMapData.instance){
  14. ZombieMapData.instance = new ZombieMapData();
  15. }
  16. return ZombieMapData.instance;
  17. }
  18. //析构
  19. static Dispose(){
  20. ZombieMapData.instance = null;
  21. }
  22. init(typeID:number){
  23. this.typeID = typeID;
  24. this.size = new BattleUtil.Vector2(10,50);
  25. //this.sizeUnit = new BattleUtil.Vector2(70,70);
  26. this.length = this.size.x*this.size.y;
  27. for(let i = 0; i < this.length; i++){
  28. this.mapPosList.push(this.getPosition(i))
  29. }
  30. // for(let i=0;i<this.length;i++){
  31. // this.pointList[i] = [];
  32. // }
  33. //读表
  34. this.normalRold = ZombieMapConf.data[typeID.toString()].RoldJsonArr;
  35. this.endPosition = 250;
  36. this.attackPosition = ZombieMapConf.data[typeID.toString()].AttackPositionArray;
  37. let EnemyJsonArr = ZombieMapConf.data[typeID.toString()].EnemyJsonArr;
  38. EnemyJsonArr.forEach((enemyObj)=>{
  39. if(enemyObj.length < 7) return;
  40. for(let j=0;j<enemyObj[5];j++){
  41. let enemyBornData:EnemyBornData = {
  42. bornTime: enemyObj[0] + enemyObj[6]*j,
  43. positionID: this.normalRold[enemyObj[4]][0],
  44. typeID: enemyObj[2],
  45. level: enemyObj[3],
  46. roldID: enemyObj[4]
  47. }
  48. if(this.enemyBornMap.has(enemyBornData.bornTime)){
  49. this.enemyBornMap.get(enemyBornData.bornTime).push(enemyBornData);
  50. }else{
  51. if(this.bornNeedTime < enemyBornData.bornTime){
  52. this.bornNeedTime = enemyBornData.bornTime;
  53. }
  54. this.enemyBornMap.set(enemyBornData.bornTime,[enemyBornData]);
  55. }
  56. }
  57. })
  58. this.attackPosDataMap.clear()
  59. this.attackPosition.forEach((v,k)=>{
  60. //this.pointList[pos.x][pos.y] = 1;
  61. let podID = Number(v)
  62. let posData:PosData = {
  63. hero: null,
  64. posID: podID,
  65. pos: this.getPosition(podID)
  66. }
  67. this.attackPosDataMap.set(v,posData);
  68. })
  69. this.curTurn = 0;
  70. //游戏是否结束
  71. this._battleEnd = false;
  72. this._bWin = false;
  73. }
  74. reset(typeID:number){
  75. this.typeID = typeID;
  76. this.attackPosDataMap.clear();
  77. //所有存活的敌人
  78. this.enemyDataList.splice(0,this.enemyDataList.length);
  79. //所有子弹
  80. this.bulletList.splice(0,this.bulletList.length);
  81. this.buffMap.clear();
  82. //操作列表 number表示帧数
  83. this.actionMap.clear();
  84. console.log("clear!!")
  85. //读表
  86. this.normalRold = ZombieMapConf.data[typeID.toString()].RoldJsonArr;
  87. this.endPosition = 250;
  88. this.attackPosition = ZombieMapConf.data[typeID.toString()].AttackPositionArray;
  89. this.enemyBornMap.clear();
  90. let EnemyJsonArr = ZombieMapConf.data[typeID.toString()].EnemyJsonArr;
  91. EnemyJsonArr.forEach((enemyObj)=>{
  92. if(enemyObj.length < 7) return;
  93. for(let j=0;j<enemyObj[5];j++){
  94. let enemyBornData:EnemyBornData = {
  95. bornTime: enemyObj[0] + enemyObj[6]*j,
  96. positionID: this.normalRold[enemyObj[4]][0],
  97. typeID: enemyObj[2],
  98. level: enemyObj[3],
  99. roldID: enemyObj[4]
  100. }
  101. if(this.enemyBornMap.has(enemyBornData.bornTime)){
  102. this.enemyBornMap.get(enemyBornData.bornTime).push(enemyBornData);
  103. }else{
  104. if(this.bornNeedTime < enemyBornData.bornTime){
  105. this.bornNeedTime = enemyBornData.bornTime;
  106. }
  107. this.enemyBornMap.set(enemyBornData.bornTime,[enemyBornData]);
  108. }
  109. }
  110. })
  111. this.attackPosDataMap.clear()
  112. this.attackPosition.forEach((v,k)=>{
  113. //this.pointList[pos.x][pos.y] = 1;
  114. let podID = Number(v)
  115. let posData:PosData = {
  116. hero: null,
  117. posID: podID,
  118. pos: this.getPosition(podID)
  119. }
  120. this.attackPosDataMap.set(v,posData);
  121. })
  122. this.curTurn = 0;
  123. this._battleEnd = false;
  124. this._bWin = false;
  125. }
  126. getNormalRold(id:number):Array<number>{
  127. return this.normalRold[id%this.normalRold.length];
  128. }
  129. //根据id获取坐标 取值范围[0,this.length-1]
  130. getPosition(id:number):BattleUtil.Vector2{
  131. if(id<0 || id>=this.length) return null;
  132. let pos = new BattleUtil.Vector2(0,0);
  133. pos.x = id%this.size.x;
  134. pos.y = Math.floor(id/this.size.x);
  135. return pos;
  136. }
  137. //添加到地图上
  138. addHero(typeID:number,level:number,posID:number){
  139. let hero = ZombieHeroDataPool.getObject()
  140. hero.init(typeID,level,posID);
  141. console.log(typeof(posID),posID)
  142. if(this.attackPosDataMap.has(posID)){
  143. let posData = this.attackPosDataMap.get(posID)
  144. let posHero = posData.hero;
  145. if(posHero){
  146. posHero.clear();
  147. ZombieHeroDataPool.putObject(posHero);
  148. }
  149. posData.hero = hero
  150. hero.position = posData.pos;
  151. }
  152. return hero;
  153. }
  154. //移除地图上指定位置的英雄
  155. removeHero(posID:number){
  156. if(this.attackPosDataMap.has(posID)){
  157. let posData = this.attackPosDataMap.get(posID);
  158. let posHero = posData.hero;
  159. if(posHero){
  160. posHero.clear();
  161. ZombieHeroDataPool.putObject(posHero);
  162. }
  163. posData.hero = null;
  164. }
  165. }
  166. /**
  167. *添加敌人
  168. * @param typeID 敌人类型
  169. * @param level 敌人等级
  170. * @param roldID 敌人行走路径
  171. * @param bronPos 敌人在路径上哪个点走
  172. */
  173. addEnemy(typeID:number,level:number,roldID:number,bronPos:number){
  174. let enemy = ZombieEnemyDataPool.getObject()
  175. let rold = this.getNormalRold(roldID);
  176. enemy.init(typeID,level,rold);
  177. this.enemyDataList.push(enemy);
  178. enemy.position = this.getPosition(bronPos);
  179. enemy.speedVector = new BattleUtil.Vector2(0,0);
  180. enemy.speedVector = this.getEnemySpeedVector(enemy);
  181. enemy.posID = bronPos;
  182. return enemy;
  183. }
  184. //移除地图上指定的敌人
  185. removeEnemy(enemy:ZombieEnemyData){
  186. let index = this.enemyDataList.indexOf(enemy);
  187. if(index>=0){
  188. this.enemyDataList.splice(index,1);
  189. }
  190. enemy.clear();
  191. ZombieEnemyDataPool.putObject(enemy);
  192. }
  193. getEnemySpeedVector(enemy:ZombieEnemyData):BattleUtil.Vector2{
  194. let oldPos = this.mapPosList[enemy.posID]
  195. let newPos = this.mapPosList[enemy.nextPosID]
  196. if(newPos){
  197. let direction = BattleUtil.Vector2.Sub(newPos,oldPos)
  198. direction.multiply(enemy.speedCur)
  199. return direction;
  200. }
  201. return new BattleUtil.Vector2(0,0);
  202. }
  203. addBuff(buffID:number,duration:number,valueList:Array<number>,src:DataBase,target:DataBase){
  204. let buff:ZombieBuffData = this.buffMap.get(buffID)
  205. if(buff == null){
  206. buff = ZombieBuffDataPool.getObject()
  207. buff.init(buffID,duration,valueList,src,target)
  208. this.buffMap.set(buff.ID,buff)
  209. if(target instanceof ZombieEnemyData){
  210. target.addBuff(buff)
  211. }
  212. }
  213. return buff;
  214. }
  215. removeBuff(ID:number){
  216. let buff:ZombieBuffData = this.buffMap.get(ID)
  217. if(buff != null){
  218. let target = buff.targetDataBase
  219. if(target instanceof ZombieEnemyData){
  220. target.removeBuff(buff)
  221. }
  222. buff.clear()
  223. ZombieBuffDataPool.putObject(buff)
  224. this.buffMap.delete(ID)
  225. }
  226. }
  227. addBullet(typeID:number,srcHero:ZombieHeroData,targetEnemy:ZombieEnemyData){
  228. let bullet:ZombieBulletData = ZombieBulletDataPool.getObject()
  229. bullet.init(typeID,srcHero,targetEnemy)
  230. this.bulletList.push(bullet)
  231. return bullet;
  232. }
  233. removeBullet(bullet:ZombieBulletData){
  234. let index = this.bulletList.indexOf(bullet);
  235. if(index>=0){
  236. this.bulletList.splice(index,1);
  237. }
  238. bullet.clear();
  239. ZombieBulletDataPool.putObject(bullet);
  240. }
  241. clear(){
  242. this.attackPosDataMap.forEach((posData,posID)=>{
  243. if(posData.hero){
  244. posData.hero.clear();
  245. ZombieHeroDataPool.putObject(posData.hero);
  246. }
  247. })
  248. this.attackPosDataMap.clear();
  249. this.enemyDataList.forEach((enemy)=>{
  250. enemy.clear();
  251. ZombieEnemyDataPool.putObject(enemy);
  252. })
  253. this.enemyDataList = [];
  254. // this.bulletList.forEach((bullet)=>{
  255. // bullet.clear();
  256. // BulletDataPool.putObject(bullet);
  257. // })
  258. // this.bulletList = [];
  259. this.buffMap.forEach((buff)=>{
  260. buff.clear();
  261. ZombieBuffDataPool.putObject(buff);
  262. })
  263. }
  264. }