From a404c82f35a9d08e92c9f6a22e5713d4ccbbfcc1 Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Mon, 12 Jan 2026 16:17:11 +0900 Subject: [PATCH] =?UTF-8?q?refactor(animation):=20=EC=95=A0=EB=8B=88?= =?UTF-8?q?=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AsciiCanvasPainter, CanvasBattleComposer 개선 - WeaponEffects 정리 --- .../canvas/ascii_canvas_painter.dart | 11 +++++++++- .../canvas/canvas_battle_composer.dart | 21 ++++++++++--------- lib/src/core/animation/weapon_effects.dart | 8 ++++++- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/src/core/animation/canvas/ascii_canvas_painter.dart b/lib/src/core/animation/canvas/ascii_canvas_painter.dart index a8dde48..b68d84d 100644 --- a/lib/src/core/animation/canvas/ascii_canvas_painter.dart +++ b/lib/src/core/animation/canvas/ascii_canvas_painter.dart @@ -161,7 +161,16 @@ class AsciiCanvasPainter extends CustomPainter { final y = gridY * cellHeight; // 레이어 투명도를 셀 렌더링에 전달 - _drawCell(canvas, cell, x, y, cellWidth, cellHeight, fontSize, layer.opacity); + _drawCell( + canvas, + cell, + x, + y, + cellWidth, + cellHeight, + fontSize, + layer.opacity, + ); } } } diff --git a/lib/src/core/animation/canvas/canvas_battle_composer.dart b/lib/src/core/animation/canvas/canvas_battle_composer.dart index ac8bffb..27349fd 100644 --- a/lib/src/core/animation/canvas/canvas_battle_composer.dart +++ b/lib/src/core/animation/canvas/canvas_battle_composer.dart @@ -92,7 +92,8 @@ class CanvasBattleComposer { // 텍스트 이펙트 레이어 (Phase 10~11) // 크리티컬 텍스트 (상단 중앙) - if (isCritical && (phase == BattlePhase.attack || phase == BattlePhase.hit)) { + if (isCritical && + (phase == BattlePhase.attack || phase == BattlePhase.hit)) { layers.add(_createCriticalTextLayer(subFrame)); } // 회피 텍스트 (캐릭터 위) @@ -410,7 +411,10 @@ class CanvasBattleComposer { final List> cells; if (attacker == AttackerType.player && weaponRarity != null) { // 무기 등급에 따른 이펙트 색상 - cells = _spriteToCellsWithColor(effectLines, weaponRarity!.effectCellColor); + cells = _spriteToCellsWithColor( + effectLines, + weaponRarity!.effectCellColor, + ); } else { // 기본 색상 (자동 색상 결정) cells = _spriteToCells(effectLines); @@ -533,19 +537,16 @@ class CanvasBattleComposer { }).toList(); }).toList(); - return AsciiLayer( - cells: cells, - zIndex: 4, - offsetX: offsetX, - offsetY: 0, - ); + return AsciiLayer(cells: cells, zIndex: 4, offsetX: offsetX, offsetY: 0); } /// 몬스터 공격 이펙트 (← 방향) List _getMonsterAttackEffect(BattlePhase phase, int subFrame) { return switch (phase) { - BattlePhase.prepare => _monsterPrepareFrames[subFrame % _monsterPrepareFrames.length], - BattlePhase.attack => _monsterAttackFrames[subFrame % _monsterAttackFrames.length], + BattlePhase.prepare => + _monsterPrepareFrames[subFrame % _monsterPrepareFrames.length], + BattlePhase.attack => + _monsterAttackFrames[subFrame % _monsterAttackFrames.length], BattlePhase.hit => _monsterHitFrames[subFrame % _monsterHitFrames.length], _ => [], }; diff --git a/lib/src/core/animation/weapon_effects.dart b/lib/src/core/animation/weapon_effects.dart index e1a7384..7bb8331 100644 --- a/lib/src/core/animation/weapon_effects.dart +++ b/lib/src/core/animation/weapon_effects.dart @@ -104,7 +104,13 @@ const _projectileEffect = WeaponEffect( [r' ', r' . ', r' [> ', r" ' ", r' '], [r' ', r' . ', r' [> ', r" ' ", r' '], [r' ', r' . ', r' [>', r" ' ", r' '], - [r' ', r' ', r' [>', r' ', r' '], + [ + r' ', + r' ', + r' [>', + r' ', + r' ', + ], ], hitFrames: [ [r' *CLANG!* ', r' ***', r' [>', r' ***', r' '],