BulletBase.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { _decorator, Component,Node, PhysicsRayResult, Vec3 } from 'cc';
  2. import { GunBase } from './GunBase';
  3. import { PoolManager } from '../../core/manager/PoolManager';
  4. import { ResUtil } from '../../utils/ResUtil';
  5. import { Game } from '../../game/Game';
  6. import { GunAttribute, userIns } from '../../data/UserData';
  7. const { ccclass, property } = _decorator;
  8. @ccclass('BulletBase')
  9. export class BulletBase extends Component {
  10. public isDead: boolean = false;
  11. //枪的数据 在gunBase中
  12. public gunBase: GunBase = null!;
  13. //子弹自动回收的时间3s
  14. public recycleTime: number = 3;
  15. constructor(){
  16. super();
  17. this.isDead = false;
  18. }
  19. start() {
  20. setTimeout(this.autoRecycle.bind(this),this.recycleTime * 1000);
  21. }
  22. /**
  23. * 根据总体的偏移 和当前枪的稳定性 来计算子弹的偏移
  24. * @param distance 总的根据枪分类 来计算的偏移
  25. * @returns
  26. */
  27. public stabilityGetBulletPos(distance: number): Vec3{
  28. //获取当前枪的最大稳定性值
  29. const maxStability:number = userIns.getGunMaxValue(this.gunBase.data,GunAttribute.stability).totalValue;
  30. //当前枪的稳定性值
  31. const currentStability = this.gunBase.data.stability;
  32. //更简单的稳定性因子计算公式
  33. const stabilityFactor = Math.max(0, 1 - (currentStability / maxStability));
  34. let screenPos: Vec3 = Game.I.player.shootUI.getScreenCenterPos();
  35. //X和Y轴添加随机偏移,稳定性越高偏移越小
  36. screenPos.x += (Math.random() - 0.5) * stabilityFactor * distance;
  37. screenPos.y += (Math.random() - 0.5) * stabilityFactor * distance;
  38. return screenPos;
  39. }
  40. /**
  41. * 加入射击中的效果
  42. * @param e 碰撞到的结果
  43. */
  44. public addHitImpact(e:PhysicsRayResult) {
  45. ResUtil.loadRes("enemy/sundries/hit_impact", this.node)
  46. .then((impact: Node | null) => {
  47. if(impact){
  48. impact.worldPosition = e.hitPoint.add(e.hitNormal.multiplyScalar(0.01));
  49. impact.forward = e.hitNormal.multiplyScalar(-1);
  50. impact.setParent(e.collider.node,true);
  51. }
  52. setTimeout(()=>{
  53. if(impact.parent){
  54. PoolManager.putNode(impact);
  55. }
  56. },3 * 1000);
  57. })
  58. .catch((error: Error) => {
  59. console.error("加载sundries/hit_impact异常", error);
  60. });
  61. }
  62. /**
  63. * 计算子弹用时
  64. */
  65. public getBulletTime(): number{
  66. let endWorldPos: Vec3 = Game.I.player.shootUI.getCrossHairPos();
  67. const bulletPos: Vec3 = this.node.position.clone();
  68. //计算3D空间距离 忽略Y轴
  69. const horizontalDistance = Vec3.distance(
  70. new Vec3(bulletPos.x, 0, bulletPos.z),
  71. new Vec3(endWorldPos.x, 0, endWorldPos.z)
  72. );
  73. //计算时间
  74. const minTime: number = 0.25;
  75. const factor: number = 5;
  76. return Math.max(horizontalDistance / (this.gunBase.data.bulletSpeed * factor), minTime);
  77. }
  78. /**
  79. * 自动回收子弹
  80. */
  81. public autoRecycle(){
  82. if(!this.isDead
  83. && this.node.parent){
  84. this.isDead = true;
  85. PoolManager.putNode(this.node);
  86. }
  87. }
  88. }