import { _decorator, Component,Node, PhysicsRayResult, Vec3 } from 'cc'; import { GunBase } from './GunBase'; import { PoolManager } from '../../core/manager/PoolManager'; import { ResUtil } from '../../utils/ResUtil'; import { Game } from '../../game/Game'; import { GunAttribute, userIns } from '../../data/UserData'; const { ccclass, property } = _decorator; @ccclass('BulletBase') export class BulletBase extends Component { public isDead: boolean = false; //枪的数据 在gunBase中 public gunBase: GunBase = null!; //子弹自动回收的时间3s public recycleTime: number = 3; constructor(){ super(); this.isDead = false; } start() { setTimeout(this.autoRecycle.bind(this),this.recycleTime * 1000); } /** * 根据总体的偏移 和当前枪的稳定性 来计算子弹的偏移 * @param distance 总的根据枪分类 来计算的偏移 * @returns */ public stabilityGetBulletPos(distance: number): Vec3{ //获取当前枪的最大稳定性值 const maxStability:number = userIns.getGunMaxValue(this.gunBase.data,GunAttribute.stability).totalValue; //当前枪的稳定性值 const currentStability = this.gunBase.data.stability; //更简单的稳定性因子计算公式 const stabilityFactor = Math.max(0, 1 - (currentStability / maxStability)); let screenPos: Vec3 = Game.I.player.shootUI.getScreenCenterPos(); //X和Y轴添加随机偏移,稳定性越高偏移越小 screenPos.x += (Math.random() - 0.5) * stabilityFactor * distance; screenPos.y += (Math.random() - 0.5) * stabilityFactor * distance; return screenPos; } /** * 加入射击中的效果 * @param e 碰撞到的结果 */ public addHitImpact(e:PhysicsRayResult) { ResUtil.loadRes("enemy/sundries/hit_impact", this.node) .then((impact: Node | null) => { if(impact){ impact.worldPosition = e.hitPoint.add(e.hitNormal.multiplyScalar(0.01)); impact.forward = e.hitNormal.multiplyScalar(-1); impact.setParent(e.collider.node,true); } setTimeout(()=>{ if(impact.parent){ PoolManager.putNode(impact); } },3 * 1000); }) .catch((error: Error) => { console.error("加载sundries/hit_impact异常", error); }); } /** * 计算子弹用时 */ public getBulletTime(): number{ let endWorldPos: Vec3 = Game.I.player.shootUI.getCrossHairPos(); const bulletPos: Vec3 = this.node.position.clone(); //计算3D空间距离 忽略Y轴 const horizontalDistance = Vec3.distance( new Vec3(bulletPos.x, 0, bulletPos.z), new Vec3(endWorldPos.x, 0, endWorldPos.z) ); //计算时间 const minTime: number = 0.25; const factor: number = 5; return Math.max(horizontalDistance / (this.gunBase.data.bulletSpeed * factor), minTime); } /** * 自动回收子弹 */ public autoRecycle(){ if(!this.isDead && this.node.parent){ this.isDead = true; PoolManager.putNode(this.node); } } }