import { _decorator, Vec3,Node, geometry, PhysicsSystem, PhysicsRayResult, RigidBody } from 'cc'; import { PoolManager } from '../../core/manager/PoolManager'; import { Game } from '../../game/Game'; import { BulletBase } from '../base/BulletBase'; import { GunBase } from '../base/GunBase'; import { Gun14 } from './Gun14'; import { Enemy } from '../../game/Enemy'; const { ccclass, property } = _decorator; //敌人1006 坦克 所用子弹 @ccclass('Bullet14') export class Bullet14 extends BulletBase { //是否必死 必死的子弹不会回收 要自己控制 private isRemoveDead: boolean = false; //射击方向的位置 private vector: Vec3 = null; /** * 初始化一个子弹 */ /** * 初始化一个子弹 * @param gun 属于哪把枪 * @param isRemoveDead 是否不受控制的子弹自己管理 */ public init(gun:GunBase,isRemoveDead:boolean = true){ this.gunBase = gun; this.isDead = false; this.isRemoveDead = isRemoveDead; } /** * 设置子弹开始位置和射击方向 * @param v 射向的方向 */ public setBulletVector(v: Vec3){ const bulletSpeed = this.gunBase.data.bulletSpeed; this.vector = v.clone().multiplyScalar(bulletSpeed); this.node.forward = v; this.rayPreCheck(bulletSpeed / 60); } /** * 射击速度发生改变 */ public speedChange() { const bulletSpeed = this.gunBase.data.bulletSpeed; if(this.vector) { this.vector = this.vector.normalize().multiplyScalar(bulletSpeed); } } /** * 实时帧更新 */ public update(deltaTime: number) { if(Game.I.isGameOver || Game.I.isPause) { this.isDead = true; PoolManager.putNode(this.node); return; } if(this.vector) { const moveDelta = this.vector.clone().multiplyScalar(deltaTime); this.node.worldPosition = this.node.worldPosition.add(moveDelta); this.rayPreCheck(moveDelta.length()); } } /** * 检测射击 * @param b * @param len 检测 */ private rayPreCheck(len: number) { const p = this.node.worldPosition; const ray = geometry.Ray.create(p.x, p.y, p.z, this.vector.x, this.vector.y, this.vector.z); const phy:PhysicsSystem = PhysicsSystem.instance; const isHit = phy.raycast(ray, 0xffffff, len); if (isHit && phy.raycastResults.length > 0) { let result:PhysicsRayResult = phy.raycastResults[0]; if(result.collider.getComponent(RigidBody)) { result.collider.getComponent(RigidBody).applyForce(this.vector, result.hitPoint); } let e: Enemy = result.collider.node.parent.getComponent(Enemy); if(e){ e.subHP(this.gunBase.data.attack,this.gunBase.data); } //自动回收了子弹 this.autoRecycle(); } } }