towerManger.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. import DataObj from "../../configData/DataObj";
  2. import { TowerType } from "../../configData/Enum";
  3. import GameConfig from "../../configData/GameConfig";
  4. import gameUI from "../UIFace/gameUI";
  5. import monsterManger from "../monster/monsterManger";
  6. import monsterNode from "../monster/monsterNode";
  7. import arrow from "./arrow";
  8. import barracks from "./barracks";
  9. import Magic from "./Magic";
  10. import taside from "./taside";
  11. import TowerData from "./TowerData";
  12. import TowerHuan from "./TowerHuan";
  13. import turret from "./turret";
  14. import gameData from "../../configData/gameData";
  15. import buildload from "./buildload";
  16. const { ccclass, property } = cc._decorator;
  17. @ccclass
  18. export default class towerManger extends cc.Component {
  19. /**塔集合 */
  20. public towerArr = [];
  21. private towerpos: cc.Vec2[] = [];
  22. private mynitu: cc.Node[] = [];
  23. private mytaside: taside[] = [];
  24. private towerHuan: TowerHuan[] = [];
  25. public myDataObj: DataObj = null;
  26. public static instance: towerManger = null;
  27. /**天赋数值 */
  28. public talantData = [];
  29. protected onLoad() {
  30. towerManger.instance = this;
  31. this.myDataObj = new DataObj();
  32. }
  33. start() {
  34. // console.log("--------------------towerManger");
  35. }
  36. /**初始化数据 */
  37. private resetData() {
  38. for (let i = 0; i < this.mynitu.length; i++) {
  39. const element = this.mynitu[i];
  40. element.destroy();
  41. }
  42. this.mynitu = [];
  43. for (let i = 0; i < this.mytaside.length; i++) {
  44. const element = this.mytaside[i];
  45. element.node.destroy();
  46. }
  47. this.mytaside = [];
  48. for (let i = 0; i < this.towerArr.length; i++) {
  49. const element = this.towerArr[i];
  50. element.node.destroy();
  51. }
  52. this.towerArr = [];
  53. this.inittalantData();
  54. gameUI.instance.openSkillBtn();
  55. }
  56. /**加载泥土 */
  57. public initTowerTaside() {
  58. this.resetData();
  59. this.towerpos = TowerData.instance().getTowerPos(gameUI.instance.myDataObj.LevelData.scene_path);
  60. var self = this;
  61. cc.resources.load("gamebg/taside_" + gameUI.instance.myDataObj.LevelData.map_type, cc.SpriteFrame, function (err, myspriteFrame: cc.SpriteFrame) {
  62. for (let i = 0; i < self.towerpos.length; i++) {
  63. const element = self.towerpos[i];
  64. let mynode = new cc.Node();
  65. let spr = mynode.addComponent(cc.Sprite);
  66. spr.spriteFrame = myspriteFrame;
  67. mynode.setPosition(element);
  68. self.node.addChild(mynode);
  69. self.mynitu.push(mynode);
  70. }
  71. });
  72. cc.resources.load("prefabs/taside", cc.Prefab, function (err, prefab: cc.Prefab) {
  73. for (let i = 0; i < self.towerpos.length; i++) {
  74. const element = self.towerpos[i];
  75. var newNode = cc.instantiate(prefab);
  76. self.node.addChild(newNode, 1006);
  77. newNode.setPosition(element);
  78. self.mytaside.push(newNode.getComponent(taside));
  79. }
  80. });
  81. }
  82. /**创建塔选项环 */
  83. private initTowerHuan(type: TowerType, taTs) {
  84. var self = this;
  85. cc.resources.load("prefabs/taHuan", cc.Prefab, function (err, prefab: cc.Prefab) {
  86. var newNode = cc.instantiate(prefab);
  87. self.node.addChild(newNode, 1006);
  88. newNode.setPosition(taTs._taside.node.getPosition().add(cc.v2(0, 45)));
  89. let mytahuan = newNode.getComponent(TowerHuan);
  90. mytahuan.setTowerType(type);
  91. mytahuan.setTower(taTs);
  92. taTs.setTaHuan(mytahuan);
  93. self.towerHuan.push(mytahuan);
  94. if (self.myDataObj.TowerData.tower_level != 1) {
  95. self.towerArr.push(taTs);
  96. }
  97. });
  98. }
  99. /**关闭已打开的选择环 */
  100. public closedHuan() {
  101. for (let i = 0; i < this.mytaside.length; i++) {
  102. const element = this.mytaside[i];
  103. if (element.isOpen) {
  104. element.turnsmall();
  105. }
  106. }
  107. for (let i = 0; i < this.towerHuan.length; i++) {
  108. const element = this.towerHuan[i];
  109. if (element.node == null) {
  110. this.towerHuan.splice(i, 1);
  111. i--;
  112. continue;
  113. }
  114. if (element.isOpen) {
  115. element.turnsmall();
  116. }
  117. }
  118. }
  119. /**传入插旗点 */
  120. public chaqiGetPos(loca: cc.Vec2) {
  121. for (let i = 0; i < this.towerHuan.length; i++) {
  122. const element = this.towerHuan[i];
  123. if (element.node == null) {
  124. this.towerHuan.splice(i, 1);
  125. i--;
  126. continue;
  127. }
  128. element.chaqiTap(loca);
  129. }
  130. }
  131. /**修建塔 */
  132. public buildTower(mytaside: taside, ID: number, solarr: cc.Vec2[], isBuild: boolean) {
  133. var self = this;
  134. this.myDataObj.writeTower_Config(ID);
  135. mytaside.ClosedTouch();
  136. cc.resources.load("prefabs/" + this.myDataObj.TowerData.name1, cc.Prefab, function (err, prefab: cc.Prefab) {
  137. var newNode = cc.instantiate(prefab);
  138. let calssName = null;
  139. let judgevec: cc.Vec2 = mytaside.node.getPosition();
  140. switch (self.myDataObj.TowerData.tower_type) {
  141. case 1:
  142. calssName = newNode.getComponent(arrow);
  143. judgevec = judgevec.add(cc.v2(-1, 40));
  144. break;
  145. case 2:
  146. calssName = newNode.getComponent(Magic);
  147. judgevec = judgevec.add(cc.v2(-1, -19));
  148. break;
  149. case 3:
  150. calssName = newNode.getComponent(turret);
  151. judgevec = judgevec.add(cc.v2(-1, -24));
  152. break;
  153. case 4:
  154. {
  155. calssName = newNode.getComponent(barracks);
  156. judgevec = judgevec.add(cc.v2(5, 30));
  157. if (solarr.length > 0) {
  158. calssName.setSoldePosArr(solarr);
  159. }
  160. }
  161. break;
  162. default:
  163. break;
  164. }
  165. newNode.setPosition(judgevec);
  166. newNode.scale = self.myDataObj.TowerData.model_scaling;
  167. self.node.addChild(newNode, Math.floor((540 - judgevec.y) / 10));
  168. calssName.setNitu(mytaside);
  169. calssName.initID(ID);
  170. calssName.towerType = self.myDataObj.TowerData.tower_type;
  171. self.initTowerHuan(self.myDataObj.TowerData.tower_type, calssName);
  172. newNode.active = false;
  173. if (isBuild) {
  174. newNode.opacity = 0;
  175. cc.tween(newNode)
  176. .delay(Number(gameData.instance().game_Const[1][2]) - 0.03)
  177. .to(0.03, { opacity: 255 })
  178. .call(() => {
  179. newNode.active = true;
  180. self.towerArr.push(calssName);
  181. })
  182. .start();
  183. }
  184. else {
  185. newNode.active = true;
  186. }
  187. });
  188. if (isBuild) {
  189. this.buildload(mytaside);
  190. }
  191. }
  192. /**升级塔 */
  193. public UpTower(tower, nextid: number) {
  194. tower._taside.addtowerGold(tower.myDataObj.TowerData.up_gold[0]);
  195. let arr = [];
  196. if (tower.towerType == 4) {
  197. arr = tower.getSoldePosArr();
  198. }
  199. this.buildTower(tower._taside, nextid, arr, false);
  200. }
  201. /**建塔进度条显示 */
  202. private buildload(mytaside: taside) {
  203. let self = this;
  204. cc.resources.load("prefabs/buildLoad", cc.Prefab, function (err, prefab: cc.Prefab) {
  205. var newNode = cc.instantiate(prefab);
  206. mytaside.node.addChild(newNode, 1005);
  207. newNode.setPosition(cc.v2(0, 0));
  208. });
  209. }
  210. /**
  211. * 求C到直线AB得距离
  212. * @param C 直线外一点
  213. * @param A 直线上一点
  214. * @param B 直线上一点
  215. */
  216. public pointToLineDistance(C: cc.Vec2, A: cc.Vec2, B: cc.Vec2): number {
  217. let dx = B.x - A.x;
  218. let dy = B.y - A.y;
  219. let d = dx * dx + dy * dy;
  220. let D: cc.Vec2 = cc.v2();
  221. if (d === 0) { // |AB| = 0,说明A与B共点
  222. D = A;
  223. } else {
  224. let q = ((C.x - A.x) * dx + (C.y - A.y) * dy) / d; // 求出q得值
  225. D = cc.v2(A.x + q * dx, A.y + q * dy);// 得到D得坐标
  226. }
  227. dx = D.x - C.x;
  228. dy = D.y - C.y;
  229. return Math.sqrt(dx * dx + dy * dy);
  230. }
  231. /**箭塔激光击中的怪减血 A开始点 B目标点之一 attnum攻击力 magicLeth激光爆炸范围*/
  232. public MagicAttckMonster(A: cc.Vec2, B: cc.Vec2, attnum: number, magicLeth: number) {
  233. let monarr = monsterManger.instance.GetMonsterArr();
  234. for (let k = 0; k < monarr.length; k++) {
  235. const minster = monarr[k];
  236. if (minster.getIsdie()) {
  237. continue;
  238. }
  239. let C: cc.Vec2 = minster.getNewPos();
  240. let juli = this.pointToLineDistance(C, A, B);
  241. if (juli < magicLeth && C.sub(A).mag() > C.sub(B).mag()) {
  242. minster.hpDown(attnum * (1 - minster.myDataObj.monsterData.magic_reduction));
  243. minster.MagicCutPhysicsreduction();
  244. }
  245. }
  246. }
  247. /**删除已销毁的塔 */
  248. public delateTower(tower) {
  249. for (let i = 0; i < this.towerArr.length; i++) {
  250. const myarrow = this.towerArr[i];
  251. if (myarrow == tower) {
  252. this.towerArr.splice(i, 1);
  253. return;
  254. }
  255. }
  256. }
  257. /**设置怪物走路是否一直走 true:停*/
  258. public setAniGo(isGo: boolean) {
  259. let monarr = monsterManger.instance.GetMonsterArr();
  260. for (let k = 0; k < monarr.length; k++) {
  261. const minster = monarr[k];
  262. minster.SetWalk(isGo);
  263. }
  264. //兵塔
  265. for (let i = 0; i < this.towerArr.length; i++) {
  266. const myarrow = this.towerArr[i];
  267. if (myarrow.towerType == 4) {
  268. myarrow.isPaused(isGo);
  269. }
  270. }
  271. }
  272. /**刷新坐标查看塔周围动静添加定时器 */
  273. public updateTowerActionSchle() {
  274. this.schedule(this.updateTowerAction, 0.1);
  275. }
  276. /**刷新坐标查看塔周围动静 */
  277. private updateTowerAction() {
  278. let monarr = monsterManger.instance.GetMonsterArr();
  279. if (monarr.length == 0 && monsterManger.instance.getIsCanOver()) {
  280. monsterManger.instance.isGameOver();
  281. this.unschedule(this.updateTowerAction);
  282. }
  283. // console.log("刷新:"+monarr.length);
  284. for (let k = 0; k < monarr.length; k++) {
  285. const minster = monarr[k];
  286. if (minster.node == null) {
  287. monarr.splice(k, 1);
  288. k--;
  289. continue;
  290. }
  291. let posy = minster.node.getPosition().y;
  292. minster.node.zIndex = Math.floor((540 - posy) / 10);
  293. //塔
  294. for (let i = 0; i < this.towerArr.length; i++) {
  295. const myarrow = this.towerArr[i];
  296. if (myarrow.getIsInSqrt(minster.node.getPosition())) {
  297. let index = myarrow.getAttackmonster().indexOf(minster);
  298. if (index < 0) {
  299. myarrow.addAttackmonster(minster);
  300. if (myarrow.getAttackmonster().length == 1) {
  301. myarrow.attckStart();
  302. }
  303. }
  304. }
  305. }
  306. }
  307. }
  308. /**天赋数值读取 */
  309. private inittalantData() {
  310. this.talantData = [];
  311. for (let i = 0; i < 30; i++) {
  312. let temparr: number[] = [];
  313. if (GameConfig.instance().storageData.myTalant[i] == 1) {
  314. this.myDataObj.writeTalent_Config(i + 1);
  315. temparr.push(this.myDataObj.talentData.parameter_2);
  316. temparr.push(this.myDataObj.talentData.parameter_3);
  317. temparr.push(this.myDataObj.talentData.parameter_4);
  318. temparr.push(this.myDataObj.talentData.parameter_5);
  319. }
  320. this.talantData.push(temparr);
  321. }
  322. }
  323. }