first commmit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import { _decorator, Component, director } from 'cc';
|
||||
import { ConfigMgr } from '../data/ConfigMgr';
|
||||
import { CCJsonLoader } from './CCJsonLoader';
|
||||
import { BossController } from '../logic/BossController';
|
||||
import { ensureCanvasSize, createLabel, createButton } from './MainMenuEntry';
|
||||
import { Color } from 'cc';
|
||||
import { DESIGN_WIDTH, DESIGN_HEIGHT } from '../common/Constants';
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
/**
|
||||
* Boss scene entry (task 7.3 / 8.2 hookup, req 9.x + 14.x).
|
||||
*
|
||||
* Attach to the root node of `Boss_ShuangHuanFang.scene`. Default bossId
|
||||
* matches the chapter-1 final boss.
|
||||
*
|
||||
* When `autoBuildUI` is enabled, two temporary debug buttons are placed on
|
||||
* screen so the flow can be validated before the combat view layer lands:
|
||||
* - Left side: "Hit Butterfly" → `onButterflyHit`
|
||||
* - Right side: "Hit Body" → `onBodyHit`
|
||||
* These will be removed once the real combat HUD is built.
|
||||
*/
|
||||
@ccclass('BossEntry')
|
||||
export class BossEntry extends Component {
|
||||
@property({ tooltip: '对应 configs/bosses.json 中的 id' })
|
||||
public bossId: string = 'shuang_huan_fang';
|
||||
|
||||
@property({ tooltip: '是否自动创建调试按钮 (战斗 HUD 就绪前使用)' })
|
||||
public autoBuildUI: boolean = true;
|
||||
|
||||
private ctrl: BossController | undefined;
|
||||
|
||||
protected async onLoad(): Promise<void> {
|
||||
if (this.autoBuildUI) this.buildDefaultUI();
|
||||
const cfg = new ConfigMgr(new CCJsonLoader());
|
||||
await cfg.load();
|
||||
this.ctrl = new BossController(cfg.boss(this.bossId));
|
||||
}
|
||||
|
||||
/** Dev-hook: attack landed on the butterfly (req 9.2). */
|
||||
public onButterflyHit(): void {
|
||||
const events = this.ctrl?.onButterflyHit() ?? [];
|
||||
this.processEvents(events);
|
||||
}
|
||||
|
||||
/** Dev-hook: attack landed on boss body (req 9.3). */
|
||||
public onBodyHit(): void {
|
||||
const events = this.ctrl?.onBodyHit() ?? [];
|
||||
this.processEvents(events);
|
||||
}
|
||||
|
||||
private processEvents(events: ReturnType<NonNullable<BossController['onBodyHit']>>): void {
|
||||
for (const ev of events) {
|
||||
if (ev.kind === 'boss_killed') {
|
||||
director.loadScene('Settlement');
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private buildDefaultUI(): void {
|
||||
ensureCanvasSize(this.node);
|
||||
createLabel(this.node, 'BOSS · 双幻坊', 0, DESIGN_HEIGHT / 2 - 60, 32, Color.WHITE);
|
||||
createLabel(
|
||||
this.node,
|
||||
'调试:先击中蝴蝶 → 再击中本体',
|
||||
0,
|
||||
DESIGN_HEIGHT / 2 - 110,
|
||||
18,
|
||||
new Color(200, 200, 200, 255),
|
||||
);
|
||||
// Left / right debug buttons, 180px off center.
|
||||
createButton(this.node, 'Hit Butterfly', -180, -120, 220, 70, () => this.onButterflyHit());
|
||||
createButton(this.node, 'Hit Body', 180, -120, 220, 70, () => this.onBodyHit());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user