barrage.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. import { EConfigConst } from "../cfg/ConfigDef";
  2. import { BulletItem } from "../cfg/bulletItem";
  3. import { ConfigMgr } from "../cfg/configMgr";
  4. import { Utils } from "../common/utils";
  5. import { MonsterModel } from "../monster/monsterModel";
  6. import monsterbullet from "../monster/monsterbullet";
  7. import bullet from "../player/bullet";
  8. import { ResMgr } from "../res/resMgr";
  9. import { ResRelease } from "../res/resRelease";
  10. import { GameSysLogic } from "../update/gameSysLogic";
  11. import Move from "../update/move";
  12. import MoveTime from "../update/moveTime";
  13. import { ZooMgr } from "../zoo/zooMgr";
  14. /**
  15. * 1 扇形弹幕: 开始角度(相对于向上), 角度,数量
  16. * 2 旋转飞行: 半径
  17. * 3 直线: 开始角度
  18. * 4 直线后炸开: 时间,开始角度,数量
  19. */
  20. enum EBulletZ {
  21. monster,
  22. player,
  23. }
  24. interface IMonsterBullet{
  25. worldPos: cc.Vec2;
  26. dirction: cc.Vec2;
  27. atk: number;
  28. }
  29. export class Barrage extends GameSysLogic{
  30. layer: cc.Node;
  31. static skillNum = 1;
  32. private static _inst: Barrage;
  33. public static get inst(): Barrage {
  34. if (this._inst == null) {
  35. this._inst = new Barrage();
  36. }
  37. return this._inst;
  38. }
  39. async createPlayerBullet(worldPos: cc.Vec2){
  40. switch(Barrage.skillNum){
  41. case 1:
  42. this.createPlayerBullet1(worldPos);
  43. break;
  44. case 2:
  45. this.createPlayerBullet2(worldPos);
  46. break;
  47. case 3:
  48. this.createPlayerBullet3(worldPos);
  49. break;
  50. case 4:
  51. this.createPlayerBullet4(worldPos);
  52. break;
  53. }
  54. }
  55. createMonsterBulletByZooid(monsterZooid: number, id: string){
  56. let bulletItem = ConfigMgr.inst.getCfgClassById(EConfigConst.bullet, id, BulletItem);
  57. let monsterNode = ZooMgr.inst.get(monsterZooid).node;
  58. let model = monsterNode.getComponent(MonsterModel);
  59. let worldPos = monsterNode.convertToWorldSpaceAR(cc.Vec2.ZERO);
  60. let dirction = monsterNode.convertToWorldSpaceAR(cc.v2(0,-1));
  61. dirction = dirction.sub(worldPos).normalize();
  62. let data: IMonsterBullet = {
  63. worldPos,
  64. dirction,
  65. atk: model.atk,
  66. };
  67. this.createMonsterBullet(data, bulletItem);
  68. }
  69. createMonsterBullet(data: IMonsterBullet, bulletItem: BulletItem) {
  70. switch (Utils.intDefault(bulletItem.data.travel, 1)) {
  71. case 1:
  72. this.createBulletById1(data, bulletItem);
  73. break;
  74. case 2:
  75. this.createBulletById2(data, bulletItem);
  76. break;
  77. case 3:
  78. this.createBulletById3(data, bulletItem);
  79. break;
  80. case 4:
  81. this.createBulletById4(data, bulletItem);
  82. break;
  83. }
  84. }
  85. // 直线
  86. async createBulletById1(data: IMonsterBullet, bulletData: BulletItem){
  87. let bulletNode = await ResMgr.inst.loadPrefab('monster/monsterBullet', this.layer);
  88. let worldPos = data.worldPos;
  89. let dirction = data.dirction;
  90. let bulletCpt = bulletNode.getComponent(monsterbullet);
  91. bulletCpt.atk = Utils.intDefault(bulletData.data.effect1) * data.atk;
  92. bulletNode.zIndex = EBulletZ.monster;
  93. let moveCpt = Utils.getCpt(Move, bulletNode);
  94. moveCpt.dirction = dirction;
  95. moveCpt.speed = Utils.intDefault(bulletData.data.speed, 500);
  96. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  97. bulletNode.setPosition(localPos);
  98. }
  99. // 直线
  100. async createPlayerBullet1(worldPos: cc.Vec2){
  101. let bulletNode = await ResMgr.inst.loadPrefab('monster/bullet', this.layer);
  102. bulletNode.zIndex = EBulletZ.player;
  103. let moveCpt = Utils.getCpt(Move, bulletNode);
  104. moveCpt.dirction = cc.v2(0,1);
  105. moveCpt.speed = 500;
  106. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  107. bulletNode.setPosition(localPos);
  108. }
  109. // 扇形弹幕
  110. async createBulletById2(data: IMonsterBullet, bulletData: BulletItem){
  111. let worldPos = data.worldPos;
  112. let dirction = data.dirction;
  113. dirction = dirction.sub(worldPos).normalize();
  114. let paramJson = Utils.strToJson(bulletData.data.param);
  115. let num = paramJson[2];
  116. let angle = paramJson[1];
  117. let leftVec2 = dirction.rotateSelf(Utils.radian(angle/2));
  118. let prefab = await ResMgr.inst.getPrefab('monster/monsterBullet');
  119. for (let index = 0; index < num; index++) {
  120. let bulletNode = ResMgr.inst.createNode(prefab, this.layer)
  121. let bulletCpt = bulletNode.getComponent(monsterbullet);
  122. bulletCpt.atk = Utils.intDefault(bulletData.data.effect1) * data.atk;
  123. bulletNode.zIndex = EBulletZ.monster;
  124. let moveCpt = Utils.getCpt(Move, bulletNode);
  125. if(angle == 360){
  126. moveCpt.dirction = leftVec2.rotate(Utils.radian(-angle / (num) * index));
  127. }
  128. else{
  129. moveCpt.dirction = leftVec2.rotate(Utils.radian(-angle / (num-1) * index));
  130. }
  131. moveCpt.speed = Utils.intDefault(bulletData.data.speed, 500);
  132. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  133. bulletNode.setPosition(localPos);
  134. }
  135. }
  136. // 扇形弹幕
  137. async createPlayerBullet2(worldPos: cc.Vec2){
  138. let num = 9;
  139. let angle = 60;
  140. let leftVec2 = cc.v2(0,1).rotateSelf(Utils.radian(angle/2));
  141. let prefab = await ResMgr.inst.getPrefab('monster/bullet');
  142. for (let index = 0; index < num; index++) {
  143. let bulletNode = ResMgr.inst.createNode(prefab, this.layer)
  144. bulletNode.zIndex = EBulletZ.player;
  145. let bulletCpt = bulletNode.getComponent(bullet);
  146. let moveCpt = Utils.getCpt(Move, bulletNode);
  147. moveCpt.dirction = leftVec2.rotate(Utils.radian(-angle / (num-1) * index));
  148. moveCpt.speed = 500;
  149. bulletCpt.setDirction(moveCpt.dirction);
  150. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  151. bulletNode.setPosition(localPos);
  152. }
  153. }
  154. // 直线炸开
  155. async createBulletById4(data: IMonsterBullet, bulletData: BulletItem){
  156. // monsterZooid: number,
  157. let worldPos = data.worldPos;
  158. let dirction = data.dirction;
  159. let prefab = await ResMgr.inst.getPrefab('monster/monsterBullet');
  160. let bulletNode = ResMgr.inst.createNode(prefab, this.layer)
  161. bulletNode.zIndex = EBulletZ.monster;
  162. let bulletCpt = bulletNode.getComponent(monsterbullet);
  163. bulletCpt.atk = Utils.intDefault(bulletData.data.effect1) * data.atk;
  164. let paramJson = Utils.strToJson(bulletData.data.param);
  165. let speed = Utils.intDefault(bulletData.data.speed, 500);
  166. let time = Utils.intDefault(paramJson[1], 100) / 100;
  167. let moveCpt = Utils.getCpt(MoveTime, bulletNode);
  168. moveCpt.dirction = dirction;
  169. moveCpt.speed = speed;
  170. moveCpt.overTime = time;
  171. moveCpt.call = ()=>{
  172. let subWorldPos = bulletNode.convertToWorldSpaceAR(cc.Vec2.ZERO);
  173. let subBulletItem = ConfigMgr.inst.getCfgClassById(EConfigConst.bullet, paramJson[2], BulletItem);
  174. this.createMonsterBullet({
  175. worldPos: subWorldPos,
  176. dirction,
  177. atk: data.atk,
  178. }, subBulletItem);
  179. bulletNode.destroy();
  180. console.log('@@=',bulletNode.getPosition().toString());
  181. }
  182. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  183. bulletNode.setPosition(localPos);
  184. }
  185. // 直线炸开
  186. async createPlayerBullet4(worldPos: cc.Vec2){
  187. let time = 1;
  188. let prefab = await ResMgr.inst.getPrefab('monster/bullet');
  189. let bulletNode = ResMgr.inst.createNode(prefab, this.layer)
  190. bulletNode.zIndex = EBulletZ.player;
  191. let moveCpt = Utils.getCpt(MoveTime, bulletNode);
  192. moveCpt.dirction = cc.v2(0,1);
  193. moveCpt.speed = 500;
  194. moveCpt.overTime = time;
  195. moveCpt.call = ()=>{
  196. let num = 10;
  197. let angle = 360;
  198. let leftVec2 = cc.v2(1,1).normalize();
  199. for (let index = 0; index < num; index++) {
  200. let bulletNode1 = ResMgr.inst.createNode(prefab, this.layer)
  201. bulletNode1.zIndex = EBulletZ.player;
  202. let bulletCpt = bulletNode1.getComponent(bullet);
  203. let moveCpt = Utils.getCpt(Move, bulletNode1);
  204. moveCpt.dirction = leftVec2.rotate(Utils.radian(-angle / (num) * index));
  205. moveCpt.speed = 500;
  206. bulletCpt.setDirction(moveCpt.dirction);
  207. bulletNode1.setPosition(bulletNode.getPosition());
  208. // console.log( "@@-", bulletNode1.getPosition().toString());
  209. }
  210. bulletNode.destroy();
  211. console.log('@@=',bulletNode.getPosition().toString());
  212. }
  213. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  214. bulletNode.setPosition(localPos);
  215. }
  216. // 旋转弹幕 --
  217. async createBulletById3(data: IMonsterBullet, bulletData: BulletItem){
  218. let worldPos = data.worldPos;
  219. let dirction = data.dirction;
  220. let paramJson = Utils.strToJson(bulletData.data.param);
  221. let r = paramJson[1];
  222. let num = paramJson[2];
  223. let leftVec2 = dirction;
  224. let angle = 360;
  225. let prefab = await ResMgr.inst.getPrefab('monster/monsterBullet');
  226. let cricleNode = new cc.Node('cricleBullet');
  227. this.layer.addChild(cricleNode);
  228. let moveCpt = Utils.getCpt(Move, cricleNode);
  229. moveCpt.dirction = dirction;
  230. moveCpt.speed = Utils.intDefault(bulletData.data.speed, 500);
  231. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  232. cricleNode.setPosition(localPos);
  233. let t = cc.tween(cricleNode).by(1, {angle: 360}).repeatForever().start();
  234. let isOver = ()=>{
  235. if(cc.isValid(cricleNode, true)){
  236. if(cricleNode.childrenCount <= 0){
  237. t.stop();
  238. cricleNode.destroy();
  239. }
  240. }
  241. }
  242. for (let index = 0; index < num; index++) {
  243. let bulletNode = ResMgr.inst.createNode(prefab, cricleNode)
  244. let bulletCpt = bulletNode.getComponent(monsterbullet);
  245. bulletCpt.atk = Utils.intDefault(bulletData.data.effect1) * data.atk;
  246. bulletNode.zIndex = EBulletZ.monster;
  247. let dirction = leftVec2.rotate(Utils.radian(-angle / (num) * index));
  248. bulletNode.setPosition(dirction.mul(r));
  249. bulletCpt.setDirction(dirction.rotate(Utils.radian(90)));
  250. bulletNode.addComponent(ResRelease).call = function(){
  251. isOver();
  252. }
  253. }
  254. }
  255. // 旋转弹幕
  256. async createPlayerBullet3(worldPos: cc.Vec2){
  257. let num = 8;
  258. let r = 40;
  259. let leftVec2 = cc.v2(0,1)
  260. let angle = 360;
  261. let prefab = await ResMgr.inst.getPrefab('monster/bullet');
  262. let node = new cc.Node('cricleBullet');
  263. this.layer.addChild(node);
  264. let moveCpt = Utils.getCpt(Move, node);
  265. moveCpt.dirction = cc.v2(0,1);
  266. moveCpt.speed = 500;
  267. let localPos = this.layer.convertToNodeSpaceAR(worldPos);
  268. node.setPosition(localPos);
  269. let t = cc.tween(node).by(1, {angle: 360}).repeatForever().start();
  270. let isOver = ()=>{
  271. if(cc.isValid(node, true)){
  272. if(node.childrenCount <= 0){
  273. t.stop();
  274. node.destroy();
  275. }
  276. }
  277. }
  278. for (let index = 0; index < num; index++) {
  279. let bulletNode = ResMgr.inst.createNode(prefab, node)
  280. let bulletCpt = bulletNode.getComponent(bullet);
  281. bulletNode.zIndex = EBulletZ.player;
  282. let dirction = leftVec2.rotate(Utils.radian(-angle / (num) * index));
  283. bulletNode.setPosition(dirction.mul(r));
  284. bulletCpt.setDirction(dirction.rotate(Utils.radian(90)));
  285. bulletNode.addComponent(ResRelease).call = function(){
  286. setTimeout(() => {
  287. isOver();
  288. }, 100);
  289. }
  290. }
  291. }
  292. }