barrage.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import bullet from "../bullet";
  2. import { Utils } from "../common/utils";
  3. import { ResMgr } from "../res/resMgr";
  4. import { ResRelease } from "../res/resRelease";
  5. import { GameSysLogic } from "../update/gameSysLogic";
  6. import Move from "../update/move";
  7. import MoveTime from "../update/moveTime";
  8. /**
  9. * 1 扇形弹幕: 开始角度(相对于向上), 角度,数量
  10. * 2 旋转飞行: 半径
  11. * 3 直线: 开始角度
  12. * 4 直线后炸开: 时间,开始角度,数量
  13. */
  14. export class Barrage extends GameSysLogic{
  15. parent: cc.Node;
  16. private static _inst: Barrage;
  17. public static get inst(): Barrage {
  18. if (this._inst == null) {
  19. this._inst = new Barrage();
  20. }
  21. return this._inst;
  22. }
  23. // 直线
  24. async createPlayerBullet2(worldPos: cc.Vec2){
  25. let bulletNode = await ResMgr.inst.loadPrefab('monster/bullet', this.parent);
  26. let moveCpt = Utils.getCpt(Move, bulletNode);
  27. moveCpt.dirction = cc.v2(0,1);
  28. moveCpt.speed = 1000;
  29. let localPos = this.parent.convertToNodeSpaceAR(worldPos);
  30. bulletNode.setPosition(localPos);
  31. }
  32. async createPlayerBullet(worldPos: cc.Vec2){
  33. this.createPlayerBullet4(worldPos);
  34. }
  35. // 扇形弹幕
  36. async createPlayerBullet1(worldPos: cc.Vec2){
  37. let num = 9;
  38. let angle = 60;
  39. let leftVec2 = cc.v2(0,1).rotateSelf(Utils.radian(angle/2));
  40. let prefab = await ResMgr.inst.getPrefab('monster/bullet');
  41. for (let index = 0; index < num; index++) {
  42. let bulletNode = ResMgr.inst.createNode(prefab, this.parent)
  43. let bulletCpt = bulletNode.getComponent(bullet);
  44. let moveCpt = Utils.getCpt(Move, bulletNode);
  45. moveCpt.dirction = leftVec2.rotate(Utils.radian(-angle / (num-1) * index));
  46. moveCpt.speed = 1000;
  47. bulletCpt.setDirction(moveCpt.dirction);
  48. let localPos = this.parent.convertToNodeSpaceAR(worldPos);
  49. bulletNode.setPosition(localPos);
  50. }
  51. }
  52. async createPlayerBullet3(worldPos: cc.Vec2){
  53. let time = 1;
  54. let prefab = await ResMgr.inst.getPrefab('monster/bullet');
  55. let bulletNode = ResMgr.inst.createNode(prefab, this.parent)
  56. let moveCpt = Utils.getCpt(MoveTime, bulletNode);
  57. moveCpt.dirction = cc.v2(0,1);
  58. moveCpt.speed = 500;
  59. moveCpt.overTime = time;
  60. moveCpt.call = ()=>{
  61. bulletNode.destroy();
  62. let num = 4;
  63. let angle = 360;
  64. let leftVec2 = cc.v2(1,1).normalize();
  65. for (let index = 0; index < num; index++) {
  66. let bulletNode = ResMgr.inst.createNode(prefab, this.parent)
  67. let bulletCpt = bulletNode.getComponent(bullet);
  68. let moveCpt = Utils.getCpt(Move, bulletNode);
  69. moveCpt.dirction = leftVec2.rotate(Utils.radian(-angle / (num) * index));
  70. moveCpt.speed = 500;
  71. bulletCpt.setDirction(moveCpt.dirction);
  72. bulletNode.setPosition(bulletNode.getPosition());
  73. }
  74. }
  75. let localPos = this.parent.convertToNodeSpaceAR(worldPos);
  76. bulletNode.setPosition(localPos);
  77. }
  78. async createPlayerBullet4(worldPos: cc.Vec2){
  79. let num = 8;
  80. let r = 40;
  81. let leftVec2 = cc.v2(0,1)
  82. let angle = 360;
  83. let prefab = await ResMgr.inst.getPrefab('monster/bullet');
  84. let node = new cc.Node('cricleBullet');
  85. this.parent.addChild(node);
  86. let moveCpt = Utils.getCpt(Move, node);
  87. moveCpt.dirction = cc.v2(0,1);
  88. moveCpt.speed = 500;
  89. let localPos = this.parent.convertToNodeSpaceAR(worldPos);
  90. node.setPosition(localPos);
  91. let t = cc.tween(node).by(1, {angle: 360}).repeatForever().start();
  92. let isOver = ()=>{
  93. if(cc.isValid(node, true)){
  94. if(node.childrenCount <= 0){
  95. t.stop();
  96. node.destroy();
  97. }
  98. }
  99. }
  100. for (let index = 0; index < num; index++) {
  101. let bulletNode = ResMgr.inst.createNode(prefab, node)
  102. let bulletCpt = bulletNode.getComponent(bullet);
  103. let dirction = leftVec2.rotate(Utils.radian(-angle / (num) * index));
  104. bulletNode.setPosition(dirction.mul(r));
  105. bulletCpt.setDirction(dirction.rotate(Utils.radian(90)));
  106. bulletNode.addComponent(ResRelease).call = function(){
  107. setTimeout(() => {
  108. isOver();
  109. }, 100);
  110. }
  111. }
  112. }
  113. }