chore:代码重构

This commit is contained in:
2026-07-17 10:15:42 +08:00
parent 5e689878ca
commit 56ea1dfd7b
58 changed files with 5784 additions and 2685 deletions
+244 -203
View File
@@ -1,221 +1,262 @@
import { _decorator, Component, Node, input, Input, EventTouch, Vec3, Quat, v3, Button, tween, v2, Camera, director, geometry, screen, PhysicsSystem, Prefab, instantiate, ParticleSystem } from 'cc';
import { RagdollBone } from '../Ragdoll/RagdollBone';
import { SingletonBase } from './framework/SingletonBase';
import { GameController } from './GameController';
// @structural-rewrite-v1
import { _decorator, Camera, EventTouch, geometry, instantiate, Node, ParticleSystem, PhysicsSystem, Prefab, screen, tween, Vec3 } from 'cc';
import { Ragdoll } from '../Ragdoll/Ragdoll';
import { RagdollBone } from '../Ragdoll/RagdollBone';
import { GameController } from './GameController';
import { SingletonBase } from './framework/SingletonBase';
import { CameraAimState } from './framework/runtime/CameraAimState';
import { UIManager } from './framework/ui/UIManager';
const { ccclass, property } = _decorator;
@ccclass('FPSCameraController')
export class FPSCameraController extends SingletonBase<FPSCameraController> {
// export class FPSCameraController extends Component {
@property(Node)
cameraNode: Node = null; // 相机节点
cameraNode: Node = null;
@property(Camera)
camera: Camera = null; // 相机节点
camera: Camera = null;
@property(Camera)
qingBao: Camera = null; // 相机节点
qingBao: Camera = null;
@property(ParticleSystem)
particle: ParticleSystem = null; // 粒子系统
particle: ParticleSystem = null;
@property(Prefab)
lastBulletPrefab: Prefab = null;
lastBullet: Node = null;
private _touchStartPos: Vec3 = new Vec3();
private _rotationSpeed: number = 0.04; // 旋转速度
private _currentRotationX: number = 0; // 当前相机的垂直旋转角度
private _currentRotationY: number = 0; // 当前相机的水平旋转角度
private _defaultRotationY: number = 0; // 当前相机的水平旋转角度
private _maxVerticalAngle: number = 70; // 最大垂直旋转角度
private _maxHorizontalAngle: number = 45; // 最大垂直旋转角度
private _defaultFOV: number = 45; // 默认 FOV
private _aimFOV: number = 25; // 瞄准时的 FOV
private _isAiming: boolean = false; // 是否正在瞄准
onLoad() {
super.onLoad()
}
init(curCamera: Camera, aimFov: number) {
this.camera = curCamera
this.cameraNode = curCamera.node
const initialRotation = this.cameraNode.getWorldRotation();
const eulerAngles = initialRotation.getEulerAngles(v3());
this._currentRotationX = eulerAngles.x;
this._currentRotationY = eulerAngles.y;
this._defaultRotationY = eulerAngles.y;
this._aimFOV = aimFov;
// 获取摄像机的默认 FOV
const camera = this.cameraNode.getComponent(Camera);
camera.fov = this._defaultFOV
}
onTouchStart(event: EventTouch) {
// console.log("onTouchStart", event)
const touch = event.touch;
this._touchStartPos.set(touch.getLocation().x, touch.getLocation().y, 0);
}
onTouchMove(event: EventTouch) {
// console.log("onTouchMove", event)
const touch = event.touch;
const deltaX = touch.getLocation().x - this._touchStartPos.x;
const deltaY = touch.getLocation().y - this._touchStartPos.y;
// 横向旋转(左右滑动):作用于摄像机的 Y 轴
const rotationY = -deltaX * this._rotationSpeed * this.camera.fov / 45;
// console.log("this.camera.fov", this.camera.fov)
this._currentRotationY += rotationY;
// 纵向旋转(上下滑动):作用于摄像机的 X 轴
const rotationX = deltaY * this._rotationSpeed * this.camera.fov / 45;// 修正:去掉负号
this._currentRotationX += rotationX;
// 限制垂直旋转角度
this._currentRotationX = Math.min(Math.max(this._currentRotationX, -this._maxVerticalAngle), 60);
this._currentRotationY = Math.min(Math.max(this._currentRotationY, this._defaultRotationY - this._maxHorizontalAngle), this._defaultRotationY + this._maxHorizontalAngle);
// 应用旋转到相机节点
const newRotation = Quat.fromEuler(new Quat(), this._currentRotationX, this._currentRotationY, 0);
this.cameraNode.setWorldRotation(newRotation);
// console.log("newRotation", this._currentRotationX, this._currentRotationY)
// 更新起始位置
this._touchStartPos.set(touch.getLocation().x, touch.getLocation().y, 0);
}
setTutorialRotate() {
this._currentRotationX = -3.99
this._currentRotationY = -32.27
const newRotation = Quat.fromEuler(new Quat(), this._currentRotationX, this._currentRotationY, 0);
this.cameraNode.setWorldRotation(newRotation);
}
shoot() {
let ray = new geometry.Ray();
this.camera.screenPointToRay(screen.windowSize.width / 2, screen.windowSize.height / 2, ray);
// 以下参数可选
const mask = 0xffffffff;
const maxDistance = 10000000;
const queryTrigger = true;
let result = false
if (PhysicsSystem.instance.raycastClosest(ray, mask, maxDistance, queryTrigger)) {
const raycastClosestResult = PhysicsSystem.instance.raycastClosestResult;
const hitPoint = raycastClosestResult.hitPoint
const hitNormal = raycastClosestResult.hitNormal;
const collider = raycastClosestResult.collider;
const distance = raycastClosestResult.distance;
console.log("碰撞检测", raycastClosestResult.collider.node.name)
let bone = raycastClosestResult.collider.node.getComponent(RagdollBone)
if (bone != null) {
if (!bone.ragdoll.isDie) {
if (GameController.getInstance().curLevel.judgeLastBullet()) {
this.fireLastBullet(bone.ragdoll, hitPoint)
} else {
this.scheduleOnce(() => {
bone.ragdoll.node.active = false
}, 2);
bone.ragdoll.setEnabled(true);
result = true
this.particle.node.setWorldPosition(hitPoint.clone())
this.particle.play()
}
private readonly aimState = new CameraAimState();
private readonly defaultFOV = 45;
private aimFOV = 25;
private isAiming = false;
protected onLoad(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void (super["onLoad"]());
}
}
} while (false);
}
tween(this.camera.node)
.by(0.05, { position: new Vec3(0, 2, 0) }, { easing: 'sineOutIn' })
.by(0.05, { position: new Vec3(0, -2, 0) }, { easing: 'sineOutIn' })
.start()
return result
}
closeQingBao() {
this.qingBao.node.active = false
}
showQingBao() {
this.qingBao.node.active = true
var enemy = GameController.getInstance().curLevel.getQingBaoEnemey().centerNode;
let pos = enemy.getWorldPosition().add(enemy.getWorldPosition().subtract(this.cameraNode.getWorldPosition()).normalize().multiplyScalar(-5))
let enemyPos = enemy.getWorldPosition()
let cameraPos = this.cameraNode.getWorldPosition()
let dirNor = enemy.getWorldPosition().subtract(this.cameraNode.getWorldPosition()).normalize()
let newPos = enemy.getWorldPosition().add(dirNor.multiplyScalar(-15))
let dir = this.cameraNode.getWorldPosition().subtract(enemy.getWorldPosition())
console.log("enemy", enemy.getWorldPosition())
console.log("camera", this.cameraNode.getWorldPosition())
console.log("newPos", newPos)
console.log("dirNor", enemy.getWorldPosition().subtract(this.cameraNode.getWorldPosition()).normalize())
this.qingBao.node.setWorldPosition(newPos)
this.qingBao.node.forward = enemy.getWorldPosition().subtract(this.cameraNode.getWorldPosition()).normalize()
}
fireLastBullet(ragdoll: Ragdoll, hitPoint: Vec3) {
var last = instantiate(this.lastBulletPrefab)
last.setParent(this.node)
last.setWorldPosition(this.cameraNode.worldPosition)
last.forward = this.cameraNode.worldPosition.subtract(hitPoint).normalize()
this.lastBullet = last
this.camera.enabled = false
UIManager.instance.closeAllPanels()
tween(last)
.to(1.67, { worldPosition: hitPoint }, { easing: 'cubicIn' })
.call(() => {
ragdoll.setEnabled(true);
last.getChildByName("bullet").active = false
GameController.getInstance().curLevel.win()
})
.start()
}
clear() {
if (this.lastBullet != null) {
this.lastBullet.destroy()
this.lastBullet = null
finally {
}
}
onAimButtonClick(isAnim: boolean) {
const camera = this.cameraNode.getComponent(Camera);
if (!camera) return;
this._isAiming = isAnim; // 切换瞄准状态
if (this._isAiming) {
// 瞄准状态:缩小 FOV
tween(camera)
.to(0.1, { fov: this._aimFOV }) // 平滑过渡到瞄准 FOV
.start();
} else {
// 非瞄准状态:恢复默认 FOV
tween(camera)
.to(0.1, { fov: this._defaultFOV }) // 平滑过渡到默认 FOV
.start();
init(curCamera: Camera, aimFov: number): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (this["camera"] = curCamera);
void (this["cameraNode"] = curCamera["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
void ((this["aimState"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["initialize"](this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
void (this["aimFOV"] = aimFov);
void ((this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](Camera)["fov"] = this["defaultFOV"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
}
} while (false);
}
finally {
}
}
}
onTouchStart(event: EventTouch): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void ((this["aimState"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["begin"]((event["touch"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getLocation"]()));
}
} while (false);
}
finally {
}
}
onTouchMove(event: EventTouch): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const fovScale = ((this["camera"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["fov"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) / (this["defaultFOV"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
void ((this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setWorldRotation"]((this["aimState"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["move"]((event["touch"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getLocation"](), fovScale)));
}
} while (false);
}
finally {
}
}
setTutorialRotate(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void ((this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setWorldRotation"]((this["aimState"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["tutorialRotation"]()));
}
} while (false);
}
finally {
}
}
shoot(): boolean {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const didHitEnemy = this["handleRaycastHit"]();
void (this["playRecoil"]());
return didHitEnemy;
}
} while (false);
}
finally {
}
}
closeQingBao(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void (((this["qingBao"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["active"] = false);
}
} while (false);
}
finally {
}
}
showQingBao(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (((this["qingBao"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["active"] = true);
const enemy = (GameController["getInstance"]()["curLevel"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getQingBaoEnemey"]()["centerNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
const enemyPosition = enemy["getWorldPosition"]();
const direction = enemyPosition["clone"]()["subtract"]((this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getWorldPosition"]())["normalize"]();
const cameraPosition = enemyPosition["clone"]()["add"](direction["clone"]()["multiplyScalar"](-15));
void (((this["qingBao"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setWorldPosition"](cameraPosition));
void (((this["qingBao"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forward"] = direction);
}
} while (false);
}
finally {
}
}
fireLastBullet(ragdoll: Ragdoll, hitPoint: Vec3): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const lastBullet = instantiate(this["lastBulletPrefab"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
void (lastBullet["parent"] = this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
void (lastBullet["setWorldPosition"]((this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["worldPosition"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
void (lastBullet["forward"] = ((this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["worldPosition"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["subtract"](hitPoint)["normalize"]());
void (this["lastBullet"] = lastBullet);
void ((this["camera"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["enabled"] = false);
void ((UIManager["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["closeAllPanels"]());
void (tween(lastBullet)["to"](1.67, { "worldPosition": hitPoint }, { "easing": 'cubicIn' })["call"](() => {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (ragdoll["setEnabled"](true));
void (lastBullet["getChildByName"]('bullet')["active"] = false);
void ((GameController["getInstance"]()["curLevel"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["win"]());
}
} while (false);
}
finally {
}
})["start"]());
}
} while (false);
}
finally {
}
}
clear(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
if (!(this["lastBullet"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
return;
void ((this["lastBullet"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["destroy"]());
void (this["lastBullet"] = null);
}
} while (false);
}
finally {
}
}
onAimButtonClick(isAnim: boolean): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const camera = (this["cameraNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](Camera);
if (!camera)
return;
void (this["isAiming"] = isAnim);
void (tween(camera)["to"](0.1, { "fov": this["isAiming"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown ? this["aimFOV"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown : this["defaultFOV"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown })["start"]());
}
} while (false);
}
finally {
}
}
private handleRaycastHit(): boolean {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const ray = new (geometry["Ray"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)();
void ((this["camera"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["screenPointToRay"](((screen["windowSize"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["width"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) / 2, ((screen["windowSize"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["height"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) / 2, ray));
if (!(PhysicsSystem["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["raycastClosest"](ray, 0xffffffff, 10000000, true))
return false;
const hit = (PhysicsSystem["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["raycastClosestResult"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
const bone = ((hit["collider"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RagdollBone);
if (!bone || (bone["ragdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["isDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)
return false;
if ((GameController["getInstance"]()["curLevel"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["judgeLastBullet"]()) {
void (this["fireLastBullet"](bone["ragdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, hit["hitPoint"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
return false;
}
void (this["scheduleOnce"](() => ((bone["ragdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["active"] = false, 2));
void ((bone["ragdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setEnabled"](true));
void (((this["particle"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setWorldPosition"]((hit["hitPoint"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["clone"]()));
void ((this["particle"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["play"]());
return true;
}
} while (false);
}
finally {
}
}
private playRecoil(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void (tween((this["camera"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["by"](0.05, { "position": new Vec3(0, 2, 0) }, { "easing": 'sineOutIn' })["by"](0.05, { "position": new Vec3(0, -2, 0) }, { "easing": 'sineOutIn' })["start"]());
}
} while (false);
}
finally {
}
}
}