Files
Alien_Sniper/assets/scripts/BattleLevel.ts
T
2026-07-15 11:38:16 +08:00

269 lines
7.9 KiB
TypeScript

import { _decorator, AssetManager, Camera, Component, instantiate, math, Node, Prefab, resources } from 'cc';
import { Ragdoll } from '../Ragdoll/Ragdoll';
import { EventCenter } from './EventCenter';
import { LevelState } from './EnumFile';
import { GameController } from './GameController';
import { UIManager } from './framework/ui/UIManager';
import { WinPanel } from './ui/WinPanel';
import { FPSCameraController } from './FPSCameraController';
import { DataMgr } from './framework/data/DataMgr';
import { LevelConfig, Weapon } from './data/ConfigData';
import { LocalSaveMgr } from './framework/data/LocalSaveMgr';
import { LosePanel } from './ui/LosePanel';
const { ccclass, property } = _decorator;
@ccclass('BattleLevel')
export class BattleLevel extends Component {
@property(Node)
roleNode: Node = null; // 相机节点
enemies: Array<Ragdoll> = [];
aliveCount: number = 0
timer: number = 300
maxTimer: number = 300
levelState: LevelState
levelIndex: number
envNode: Node = null
enemyNode: Node = null
gunNode: Node = null
levelResult: BattleResult
protected onLoad(): void {
}
waitUntil(condition: () => boolean): Promise<void> {
return new Promise((resolve) => {
const checkCondition = () => {
if (condition()) {
resolve(); // 条件成立,结束等待
} else {
// 条件不成立,继续轮询
requestAnimationFrame(checkCondition);
}
};
checkCondition(); // 开始检查条件
});
}
initLevel() {
this.enemies = []
this.aliveCount = 0
this.timer = this.maxTimer
for (let index = 0; index < this.roleNode.children.length; index++) {
let ragdoll = this.roleNode.children[index].getComponent(Ragdoll)
if (ragdoll) {
this.enemies.push(ragdoll)
this.aliveCount += 1
}
}
this.levelState = LevelState.Loading
GameController.getInstance().onLoadComplete()
}
async loadLevel() {
let loadSceneComplete: boolean = false
let loadRoleComplete: boolean = false
this.node.destroyAllChildren()
let levelIndex = LocalSaveMgr.instance.playerData.levelIndex
if (GameController.getInstance().forceLevelIndex > 1) {
levelIndex = GameController.getInstance().forceLevelIndex
}
this.levelIndex = levelIndex
// levelIndex = 1
let config = DataMgr.getInstance().GetDataById(LevelConfig, levelIndex);
this.qingBaoTarget = null
this.saoMiaoTarget = null
console.log("加载关卡", levelIndex, config)
if (levelIndex <= 30) {
// games-display/cdn/SearchAliens/assets/
AssetManager.instance.loadBundle('level', (err, bundle) => {
bundle.load(`env/${config.env}`, Prefab, (err, prefab) => {
var item = instantiate(prefab)
item.setParent(this.node)
loadSceneComplete = true
})
bundle.load(`enemy/${config.enemy}`, Prefab, (err, prefab) => {
var item = instantiate(prefab)
item.setParent(this.node)
FPSCameraController.getInstance().init(item.getChildByPath("Player/Main Camera").getComponent(Camera), config.aimFov)
this.roleNode = item
let weapon = DataMgr.getInstance().GetDataById(Weapon, LocalSaveMgr.instance.playerData.equipedWeapon)
resources.load(`weapon/${weapon.prefab}`, Prefab, (err, prefab) => {
var gun = instantiate(prefab)
this.gunNode = gun
gun.setParent(item.getChildByPath(`Player/Main Camera/${weapon.point}`))
loadRoleComplete = true
});
})
}
);
} else {
AssetManager.instance.loadBundle('level', (err, bundle) => {
bundle.load(`env/${config.env}`, Prefab, (err, prefab) => {
var item = instantiate(prefab)
item.setParent(this.node)
loadSceneComplete = true
})
AssetManager.instance.loadBundle('levelRemote', (err, bundle) => {
bundle.load(`enemy/${config.enemy}`, Prefab, (err, prefab) => {
var item = instantiate(prefab)
item.setParent(this.node)
FPSCameraController.getInstance().init(item.getChildByPath("Player/Main Camera").getComponent(Camera), config.aimFov)
this.roleNode = item
let weapon = DataMgr.getInstance().GetDataById(Weapon, LocalSaveMgr.instance.playerData.equipedWeapon)
resources.load(`weapon/${weapon.prefab}`, Prefab, (err, prefab) => {
var gun = instantiate(prefab)
this.gunNode = gun
gun.setParent(item.getChildByPath(`Player/Main Camera/${weapon.point}`))
loadRoleComplete = true
});
})
});
}
);
}
await this.waitUntil(() => loadSceneComplete && loadRoleComplete);
this.initLevel()
}
unLoadLevel() {
this.node.destroyAllChildren()
this.levelState = LevelState.None
}
onEnemyDie(target: Ragdoll) {
this.aliveCount -= 1
EventCenter.onEnemyDie.emit(null)
}
judgeLastBullet(): boolean {
return this.aliveCount == 1
}
startLevel() {
this.levelState = LevelState.Running
}
protected update(dt: number): void {
if (this.levelState == LevelState.Running) {
this.timer -= dt
if (this.timer <= 0) {
this.timer = 0
this.lose()
}
}
}
lose() {
this.levelState = LevelState.Result
UIManager.instance.openPanel(LosePanel)
}
win() {
this.levelState = LevelState.Result
let levelResult = new BattleResult()
let remainTimer = Math.ceil(this.timer)
levelResult.timer = remainTimer
levelResult.enemyCount = this.enemies.length
levelResult.timerCoin = levelResult.timer
levelResult.enemyCoin = levelResult.enemyCount * 10
levelResult.coinCount = levelResult.timerCoin + levelResult.enemyCoin
this.levelResult = levelResult
LocalSaveMgr.instance.passLevel()
UIManager.instance.openPanel(WinPanel)
}
ContinueRun() {
this.levelState = LevelState.Running
}
pause() {
this.levelState = LevelState.Pause
}
addTimer() {
this.timer += 180
}
getAliveEnemeyCount() {
let aliveCount = 0
for (let index = 0; index < this.enemies.length; index++) {
if (!this.enemies[index].isDie) {
aliveCount++
}
}
return aliveCount
}
getAliveEnemey() {
for (let index = 0; index < this.enemies.length; index++) {
if (!this.enemies[index].isDie) {
return this.enemies[index]
}
}
}
getQingBaoEnemey() {
this.qingBaoTarget = this.getAliveEnemey()
return this.qingBaoTarget
}
qingBaoTarget: Ragdoll
getTutorialAliveEnemey() {
return this.enemies[this.enemies.length - 1]
}
haveQingBaoTarget() {
return this.qingBaoTarget != null && !this.qingBaoTarget.isDie
}
saoMiaoTarget: Ragdoll
SetSaoMiaoTarget() {
this.saoMiaoTarget = this.getAliveEnemey()
}
}
export class BattleResult {
timer: number
enemyCount: number
coinCount: number
timerCoin: number
enemyCoin: number
}