12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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);
- }
- }
- }
|