From fba2f2a4cda286bb689b05f3dffa787405b15f0f Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Fri, 26 Dec 2025 19:18:06 +0900 Subject: [PATCH] =?UTF-8?q?fix(animation):=20=EC=A0=84=ED=88=AC=20?= =?UTF-8?q?=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A6=88=20=ED=9D=90=EB=A6=84=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 공격 시 prepare 페이즈부터 시작하여 준비 동작 표시 - 이펙트 레이어를 prepare 페이즈에서도 표시 - 공격자 타입을 idle 페이즈 진입 시에만 리셋 - 공격 사이클(prepare→attack→hit→recover) 동안 공격자 유지 --- .../canvas/canvas_battle_composer.dart | 6 ++++-- .../game/widgets/ascii_animation_card.dart | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/src/core/animation/canvas/canvas_battle_composer.dart b/lib/src/core/animation/canvas/canvas_battle_composer.dart index ee00730..49c8555 100644 --- a/lib/src/core/animation/canvas/canvas_battle_composer.dart +++ b/lib/src/core/animation/canvas/canvas_battle_composer.dart @@ -50,8 +50,10 @@ class CanvasBattleComposer { _createMonsterLayer(phase, subFrame, attacker), ]; - // 이펙트 레이어 (공격/히트 페이즈에서만, 공격자 있을 때) - if ((phase == BattlePhase.attack || phase == BattlePhase.hit) && + // 이펙트 레이어 (준비/공격/히트 페이즈에서, 공격자 있을 때) + if ((phase == BattlePhase.prepare || + phase == BattlePhase.attack || + phase == BattlePhase.hit) && attacker != AttackerType.none) { final effectLayer = _createEffectLayer(phase, subFrame, attacker); if (effectLayer != null) { diff --git a/lib/src/features/game/widgets/ascii_animation_card.dart b/lib/src/features/game/widgets/ascii_animation_card.dart index a2f2d3b..50816b7 100644 --- a/lib/src/features/game/widgets/ascii_animation_card.dart +++ b/lib/src/features/game/widgets/ascii_animation_card.dart @@ -211,26 +211,26 @@ class _AsciiAnimationCardState extends State { isParry, isSkill, ) = switch (event.type) { - // 플레이어 공격 → attack 페이즈 + // 플레이어 공격 → prepare 페이즈부터 시작 (준비 동작 표시) CombatEventType.playerAttack => ( - BattlePhase.attack, + BattlePhase.prepare, event.isCritical, false, false, false, ), - // 스킬 사용 → attack 페이즈 + 스킬 이펙트 + // 스킬 사용 → prepare 페이즈부터 시작 + 스킬 이펙트 CombatEventType.playerSkill => ( - BattlePhase.attack, + BattlePhase.prepare, event.isCritical, false, false, true, ), - // 몬스터 공격 → hit 페이즈 + // 몬스터 공격 → prepare 페이즈부터 시작 CombatEventType.monsterAttack => ( - BattlePhase.hit, + BattlePhase.prepare, false, false, false, @@ -476,8 +476,11 @@ class _AsciiAnimationCardState extends State { _showSkillEffect = false; // 이벤트 기반 페이즈 종료 _isEventDrivenPhase = false; - // 공격자 타입 리셋 (Phase 7) - _currentAttacker = AttackerType.none; + // 공격자 타입 리셋 (idle 페이즈 진입 시에만) + // 공격 사이클(prepare→attack→hit→recover) 동안 유지 + if (_battlePhaseSequence[_phaseIndex].$1 == BattlePhase.idle) { + _currentAttacker = AttackerType.none; + } } else { _battleSubFrame++; }