first commmit

This commit is contained in:
jakciehan
2026-05-06 08:17:32 +08:00
commit 427a33c55b
269 changed files with 20906 additions and 0 deletions
@@ -0,0 +1,69 @@
import { _decorator, Component, director, Label, Node, Color } from 'cc';
import { ChapterSettlement, ISettlementStats } from '../logic/ChapterSettlement';
import { ensureCanvasSize, createLabel, createButton } from './MainMenuEntry';
import { DESIGN_HEIGHT } from '../common/Constants';
const { ccclass, property } = _decorator;
/**
* Settlement scene entry (task 8.2 hookup, req 14.x).
*
* Attach to the root of `Settlement.scene`. All UI is auto-built by default
* (title, score, closing line, back-to-menu button). If `autoBuildUI` is
* disabled and you wire up `scoreLabelNode` / `closingLabelNode` manually,
* those wins.
*/
@ccclass('SettlementEntry')
export class SettlementEntry extends Component {
@property({ type: Node, tooltip: '得分 Label 节点 (可留空自动创建)' })
public scoreLabelNode: Node | null = null;
@property({ type: Node, tooltip: '结局旁白 Label 节点 (可留空自动创建)' })
public closingLabelNode: Node | null = null;
@property({ tooltip: '是否自动创建结算界面 (Label + Back 按钮)' })
public autoBuildUI: boolean = true;
protected onLoad(): void {
if (this.autoBuildUI) this.buildDefaultUI();
const defaultStats: ISettlementStats = {
totalScore: 0,
stageScore: 0,
comboCount: 0,
flawless: true,
remainingTimeSec: 0,
};
const settlement = new ChapterSettlement(defaultStats);
const result = settlement.build();
this.setLabel(this.scoreLabelNode, `Stage Score: ${result.stats.stageScore}`);
this.setLabel(this.closingLabelNode, result.closingLine);
}
/** Bind to a "Back to Menu" button. */
public onReturnToMenu(): void {
director.loadScene('MainMenu');
}
private setLabel(node: Node | null, text: string): void {
if (!node) return;
const label = node.getComponent(Label);
if (label) label.string = text;
}
private buildDefaultUI(): void {
ensureCanvasSize(this.node);
// Title.
createLabel(this.node, '章 节 结 算', 0, DESIGN_HEIGHT / 2 - 70, 40, Color.WHITE);
// Score label (created only if inspector did not supply one).
if (!this.scoreLabelNode) {
this.scoreLabelNode = createLabel(this.node, '', 0, 40, 30, new Color(255, 220, 120, 255));
}
// Closing line label.
if (!this.closingLabelNode) {
this.closingLabelNode = createLabel(this.node, '', 0, -30, 24, new Color(200, 200, 200, 255));
}
// Bottom "Back to Menu" button.
createButton(this.node, 'Back to Menu', 0, -DESIGN_HEIGHT / 2 + 80, 240, 60, () => this.onReturnToMenu());
}
}