From 6c86a97c8f1a87492df9f9456e747c487a041b58 Mon Sep 17 00:00:00 2001 From: hypercross Date: Sat, 4 Apr 2026 15:43:50 +0800 Subject: [PATCH] refactor: await for tween interruption --- packages/boop-game/src/game/boop.ts | 6 +++--- packages/boop-game/src/scenes/GameScene.ts | 7 +++---- packages/framework/src/scenes/GameHostScene.ts | 6 ++++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/boop-game/src/game/boop.ts b/packages/boop-game/src/game/boop.ts index 366eb78..27d815f 100644 --- a/packages/boop-game/src/game/boop.ts +++ b/packages/boop-game/src/game/boop.ts @@ -120,7 +120,7 @@ registration.add('turn ', async function(cmd) { const pieceType = type === 'cat' ? 'cat' : 'kitten'; placePiece(this.context, row, col, turnPlayer, pieceType); - applyBoops(this.context, row, col, pieceType); + await applyBoops(this.context, row, col, pieceType); const graduatedLines = checkGraduation(this.context, turnPlayer); if (graduatedLines.length > 0) { @@ -192,7 +192,7 @@ export function placePiece(host: MutableSignal, row: number, col: num decrementSupply(playerData, pieceType); } -export function applyBoops(host: MutableSignal, placedRow: number, placedCol: number, placedType: PieceType) { +export async function applyBoops(host: MutableSignal, placedRow: number, placedCol: number, placedType: PieceType) { const pieces = host.value.pieces; const piecesArray = Object.values(pieces); @@ -215,7 +215,7 @@ export function applyBoops(host: MutableSignal, placedRow: number, pl } } - host.produce(state => { + await host.produceAsync(state => { const board = state.board; const currentPieces = state.pieces; diff --git a/packages/boop-game/src/scenes/GameScene.ts b/packages/boop-game/src/scenes/GameScene.ts index d0f036e..55ce5d1 100644 --- a/packages/boop-game/src/scenes/GameScene.ts +++ b/packages/boop-game/src/scenes/GameScene.ts @@ -39,7 +39,7 @@ export class GameScene extends GameHostScene { this.drawGrid(); this.createSupplyUI(); - this.disposables.add(spawnEffect(new BoopPartSpawner(this, this.gameHost.state as MutableSignal))); + this.disposables.add(spawnEffect(new BoopPartSpawner(this))); this.watch(() => { const winner = this.state.winner; @@ -447,13 +447,12 @@ class BoopPartSpawner implements Spawner // 添加落子动画 container.setScale(0); - this.scene.tweens.add({ + this.scene.addTweenInterruption(this.scene.tweens.add({ targets: container, scale: 1, duration: 200, ease: 'Back.easeOut', - }); - this.state.addInterruption(new Promise(resolve => setTimeout(resolve, 200))); + })); return container; } diff --git a/packages/framework/src/scenes/GameHostScene.ts b/packages/framework/src/scenes/GameHostScene.ts index 540cdad..40dbfcb 100644 --- a/packages/framework/src/scenes/GameHostScene.ts +++ b/packages/framework/src/scenes/GameHostScene.ts @@ -19,6 +19,12 @@ export abstract class GameHostScene> addInterruption(promise: Promise){ this.gameHost?.addInterruption(promise); } + + addTweenInterruption(tween: Phaser.Tweens.Tween){ + this.addInterruption(new Promise( + resolve => tween.once('complete', resolve) + )); + } init(data: GameHostSceneOptions): void { this.gameHost = data.gameHost;