refactor: simplify input handling?
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
import Phaser from 'phaser';
|
||||
import type { TicTacToeState, TicTacToePart, PlayerType } from '@/game/tic-tac-toe';
|
||||
import { ReactiveScene, bindRegion, createInputMapper, createPromptHandler } from 'boardgame-phaser';
|
||||
import type { PromptEvent } from 'boardgame-core';
|
||||
import { ReactiveScene, bindRegion, createInputMapper, InputMapper } from 'boardgame-phaser';
|
||||
|
||||
const CELL_SIZE = 120;
|
||||
const BOARD_OFFSET = { x: 100, y: 100 };
|
||||
@@ -10,10 +9,10 @@ const BOARD_SIZE = 3;
|
||||
export class GameScene extends ReactiveScene<TicTacToeState> {
|
||||
private boardContainer!: Phaser.GameObjects.Container;
|
||||
private gridGraphics!: Phaser.GameObjects.Graphics;
|
||||
private inputMapper!: ReturnType<typeof createInputMapper<TicTacToeState>>;
|
||||
private promptHandler!: ReturnType<typeof createPromptHandler<TicTacToeState>>;
|
||||
private activePrompt: PromptEvent | null = null;
|
||||
private inputMapper!: InputMapper;
|
||||
private turnText!: Phaser.GameObjects.Text;
|
||||
/** Receives the active prompt from the single PromptHandler in main.tsx */
|
||||
promptSignal: { current: any } = { current: null };
|
||||
|
||||
constructor() {
|
||||
super('GameScene');
|
||||
@@ -83,16 +82,14 @@ export class GameScene extends ReactiveScene<TicTacToeState> {
|
||||
}
|
||||
|
||||
private setupInput(): void {
|
||||
this.inputMapper = createInputMapper(
|
||||
this,
|
||||
this.commands,
|
||||
{ current: null }, // 不再需要,保留以兼容接口
|
||||
(cmd: string) => {
|
||||
// 使用 PromptHandler.submit() 而不是直接 tryCommit
|
||||
// 这样会自动处理没有活跃 prompt 时的排队逻辑
|
||||
return this.promptHandler.submit(cmd);
|
||||
this.inputMapper = createInputMapper(this, {
|
||||
onSubmit: (cmd: string) => {
|
||||
// Delegate to the single PromptHandler via the shared commands reference.
|
||||
// The actual PromptHandler instance lives in main.tsx and is set up once.
|
||||
// We call through a callback that main.tsx provides via the scene's public interface.
|
||||
return this.submitToPrompt(cmd);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
this.inputMapper.mapGridClick(
|
||||
{ x: CELL_SIZE, y: CELL_SIZE },
|
||||
@@ -107,17 +104,21 @@ export class GameScene extends ReactiveScene<TicTacToeState> {
|
||||
return `play ${currentPlayer} ${row} ${col}`;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
this.promptHandler = createPromptHandler(this, this.commands, {
|
||||
onPrompt: (prompt) => {
|
||||
this.activePrompt = prompt;
|
||||
},
|
||||
onCancel: () => {
|
||||
this.activePrompt = null;
|
||||
},
|
||||
});
|
||||
/**
|
||||
* Called by main.tsx to wire up the single PromptHandler's submit function.
|
||||
*/
|
||||
private _submitToPrompt: ((cmd: string) => string | null) | null = null;
|
||||
|
||||
this.promptHandler.start();
|
||||
setSubmitPrompt(fn: (cmd: string) => string | null): void {
|
||||
this._submitToPrompt = fn;
|
||||
}
|
||||
|
||||
private submitToPrompt(cmd: string): string | null {
|
||||
return this._submitToPrompt
|
||||
? this._submitToPrompt(cmd)
|
||||
: null; // no handler wired yet, accept silently
|
||||
}
|
||||
|
||||
private drawGrid(): void {
|
||||
|
||||
Reference in New Issue
Block a user