104 lines
3.1 KiB
TypeScript
104 lines
3.1 KiB
TypeScript
import { _decorator, Component, Vec3 } from 'cc';
|
||
import { RoleController } from './RoleController';
|
||
const { ccclass, property } = _decorator;
|
||
|
||
@ccclass("Bullet")
|
||
export class Bullet extends Component {
|
||
|
||
speed: number = 0;
|
||
target: RoleController = null;
|
||
timer: number = 0;
|
||
direction: Vec3 = new Vec3(0, 1, 0); // 子弹飞行的方向
|
||
destroyed: Boolean = false;
|
||
distance: number = 0;
|
||
|
||
|
||
|
||
|
||
bulletDestroy() {
|
||
this.node.getChildByName("Node").active = false;
|
||
this.destroyed = true;
|
||
setTimeout(() => {
|
||
this.node.removeFromParent();
|
||
}, 1000);
|
||
}
|
||
|
||
|
||
|
||
init(target: RoleController, timer: number) {
|
||
|
||
this.target = target;
|
||
this.timer = timer;
|
||
|
||
|
||
const dx = target.node.position.x - this.node.position.x;
|
||
const dy = target.node.position.y - this.node.position.y;
|
||
|
||
// 使用 atan2 计算角度(弧度)
|
||
const angleRad = Math.atan2(dy, dx);
|
||
|
||
// 将弧度转换为度数(如果你的游戏引擎使用度数)
|
||
const angleDeg = angleRad * (180 / Math.PI);
|
||
|
||
this.node.angle = angleDeg;
|
||
|
||
}
|
||
|
||
|
||
|
||
update(dt: number) {
|
||
|
||
this.timer -= dt;
|
||
if (this.target && !this.destroyed && this.timer > 0) {
|
||
this.distance = Vec3.distance(this.node.worldPosition, this.target.node.worldPosition);
|
||
if (this.speed == 0) this.speed = this.distance / this.timer;
|
||
|
||
Vec3.subtract(this.direction, this.target.node.worldPosition, this.node.worldPosition);
|
||
Vec3.normalize(this.direction, this.direction);
|
||
|
||
// 计算子弹到目标的方向向量
|
||
const dx = this.target.node.worldPosition.x - this.node.worldPosition.x;
|
||
const dy = this.target.node.worldPosition.y - this.node.worldPosition.y;
|
||
|
||
// 计算角度(弧度)
|
||
let angleRad = Math.atan2(dy, dx);
|
||
|
||
// 转换为度数(如果你的引擎使用度数)
|
||
let angleDeg = angleRad * (180 / Math.PI);
|
||
|
||
// 调整角度以匹配子弹的默认朝向(如果子弹默认朝上,我们需要调整角度使其面向目标)
|
||
// 假设默认朝向是Y轴正方向(即向上),我们需要将角度从水平方向(X轴)旋转到目标方向
|
||
// 由于atan2返回的是从X轴正方向逆时针到点的角度,我们需要进行一些调整
|
||
// 这里的-90度是将Y轴正方向(向上)转换为X轴正方向(向右)的偏移
|
||
// 然后根据目标位置调整角度
|
||
angleDeg = angleDeg + 90; // 调整为从“向上”到目标的角度
|
||
|
||
// 如果需要,可以在这里添加一些范围检查或标准化,确保角度在0-360度之间
|
||
if (angleDeg < 0) angleDeg += 360;
|
||
|
||
// 设置子弹的旋转角度
|
||
this.node.angle = -angleDeg; // 注意:这里的负号可能是因为你希望角度方向与默认朝向相反,根据具体情况调整
|
||
|
||
// 更新子弹位置
|
||
let displacement = Vec3.multiplyScalar(new Vec3, this.direction, this.speed * dt);
|
||
// 如果这里的缩放是为了效果,保留它;否则,可以移除缩放部分
|
||
let newPosition = Vec3.add(new Vec3, this.node.position, displacement);
|
||
this.node.setPosition(newPosition);
|
||
|
||
if (this.distance < 10) {
|
||
this.bulletDestroy(); // 假设近距离时销毁子弹
|
||
}
|
||
} else if (this.timer < 0) {
|
||
this.bulletDestroy();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|