diff --git a/packages/onitama-game/src/spawners/CardSpawner.ts b/packages/onitama-game/src/spawners/CardSpawner.ts index d1abad8..7c0e844 100644 --- a/packages/onitama-game/src/spawners/CardSpawner.ts +++ b/packages/onitama-game/src/spawners/CardSpawner.ts @@ -23,14 +23,19 @@ export class CardContainer extends Phaser.GameObjects.Container { private highlightRect: Phaser.GameObjects.Rectangle | null = null; private highlightTween: Phaser.Tweens.Tween | null = null; private _cardId: string; + private _rotation: number = 0; - constructor(scene: OnitamaScene, cardId: string, card: Card) { + constructor(scene: OnitamaScene, cardId: string, card: Card, rotation: number = 0) { super(scene, 0, 0); this._cardId = cardId; + this._rotation = rotation; // 将容器添加到场景 scene.add.existing(this); + // 应用旋转 + this.angle = rotation; + // 创建卡牌视觉 this.createCardVisual(card); @@ -42,6 +47,26 @@ export class CardContainer extends Phaser.GameObjects.Container { this.addHighlightEffect(scene); } + /** + * 更新卡牌旋转(带动画) + */ + setRotation(rotation: number, animated: boolean = false): this { + if (animated) { + const currentAngle = this.angle; + const tween = this.scene.tweens.add({ + targets: this, + angle: { from: currentAngle, to: rotation }, + duration: 400, + ease: 'Back.easeOut', + }); + (this.scene as OnitamaScene).addTweenInterruption(tween); + } else { + this.angle = rotation; + } + this._rotation = rotation; + return this; + } + /** * 高亮卡牌 */ @@ -251,6 +276,20 @@ export class CardSpawner implements Spawner { } onUpdate(data: CardSpawnData, obj: CardContainer): void { + const isBlackTurn = this.scene.state.currentPlayer === 'black'; + + // 检查卡牌是否需要旋转 + let targetRotation = 0; + if (data.position === 'black') { + targetRotation = -180; // 黑方卡牌始终旋转 + } else if (data.position === 'spare' && isBlackTurn) { + targetRotation = -180; // 备用卡牌在黑方回合旋转 + } + + if (obj.angle !== targetRotation) { + obj.setRotation(targetRotation, true); + } + // 只在位置实际变化时才播放移动动画 if (!this.hasPositionChanged(data)) { this.previousData.set(data.cardId, { ...data }); @@ -285,7 +324,16 @@ export class CardSpawner implements Spawner { return emptyContainer; } - const container = new CardContainer(this.scene, data.cardId, card); + // 计算旋转角度 + const isBlackTurn = this.scene.state.currentPlayer === 'black'; + let rotation = 0; + if (data.position === 'black') { + rotation = 180; // 黑方卡牌始终旋转 + } else if (data.position === 'spare' && isBlackTurn) { + rotation = 180; // 备用卡牌在黑方回合旋转 + } + + const container = new CardContainer(this.scene, data.cardId, card, rotation); const pos = this.getCardPosition(data); container.x = pos.x; container.y = pos.y; diff --git a/packages/onitama-game/src/spawners/PawnSpawner.ts b/packages/onitama-game/src/spawners/PawnSpawner.ts index deb04a6..dd991ba 100644 --- a/packages/onitama-game/src/spawners/PawnSpawner.ts +++ b/packages/onitama-game/src/spawners/PawnSpawner.ts @@ -228,7 +228,6 @@ export class PawnSpawner implements Spawner { targets: obj, scale: 0, alpha: 0, - y: obj.y - 30, duration: 300, ease: 'Back.easeIn', onComplete: () => obj.destroy(),