Feat: Implement Enemy Attack Animation
This commit is contained in:
@@ -42,10 +42,13 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
final GlobalKey<ShakeWidgetState> _shakeKey = GlobalKey<ShakeWidgetState>();
|
||||
final GlobalKey<BattleAnimationWidgetState> _playerAnimKey =
|
||||
GlobalKey<BattleAnimationWidgetState>();
|
||||
final GlobalKey<BattleAnimationWidgetState> _enemyAnimKey =
|
||||
GlobalKey<BattleAnimationWidgetState>(); // Added Enemy Anim Key
|
||||
final GlobalKey<ExplosionWidgetState> _explosionKey =
|
||||
GlobalKey<ExplosionWidgetState>();
|
||||
bool _showLogs = false;
|
||||
bool _isPlayerAttacking = false; // Player Attack Animation State
|
||||
bool _isEnemyAttacking = false; // Enemy Attack Animation State
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -287,8 +290,60 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (event.type == ActionType.attack &&
|
||||
event.target == EffectTarget.player &&
|
||||
event.feedbackType == null) {
|
||||
// 2. Enemy Attack Animation Trigger
|
||||
final RenderBox? playerBox =
|
||||
_playerKey.currentContext?.findRenderObject() as RenderBox?;
|
||||
final RenderBox? enemyBox =
|
||||
_enemyKey.currentContext?.findRenderObject() as RenderBox?;
|
||||
|
||||
if (playerBox != null && enemyBox != null) {
|
||||
final playerPos = playerBox.localToGlobal(Offset.zero);
|
||||
final enemyPos = enemyBox.localToGlobal(Offset.zero);
|
||||
|
||||
// Enemy moves TO Player
|
||||
final offset = playerPos - enemyPos;
|
||||
|
||||
// Start Animation: Hide Stats
|
||||
setState(() {
|
||||
_isEnemyAttacking = true;
|
||||
});
|
||||
|
||||
_enemyAnimKey.currentState
|
||||
?.animateAttack(offset, () {
|
||||
showEffect(); // Show Effect at Impact!
|
||||
|
||||
// Shake and Explosion ONLY for Risky (Enemy can also do risky attacks)
|
||||
if (event.risk == RiskLevel.risky) {
|
||||
_shakeKey.currentState?.shake();
|
||||
|
||||
// Explosion on Player
|
||||
RenderBox? stackBox =
|
||||
_stackKey.currentContext?.findRenderObject()
|
||||
as RenderBox?;
|
||||
if (stackBox != null) {
|
||||
Offset localPlayerPos = stackBox.globalToLocal(playerPos);
|
||||
localPlayerPos += Offset(
|
||||
playerBox.size.width / 2,
|
||||
playerBox.size.height / 2,
|
||||
);
|
||||
_explosionKey.currentState?.explode(localPlayerPos);
|
||||
}
|
||||
}
|
||||
}, event.risk)
|
||||
.then((_) {
|
||||
// End Animation: Show Stats
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isEnemyAttacking = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Not a player attack, show immediately
|
||||
// Not a player/enemy attack movement, show immediately
|
||||
showEffect();
|
||||
}
|
||||
});
|
||||
@@ -444,11 +499,15 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
Positioned(
|
||||
top: 0,
|
||||
right: 0,
|
||||
child: CharacterStatusCard(
|
||||
character: battleProvider.enemy,
|
||||
isPlayer: false,
|
||||
isTurn: !battleProvider.isPlayerTurn,
|
||||
key: _enemyKey,
|
||||
child: BattleAnimationWidget(
|
||||
key: _enemyAnimKey,
|
||||
child: CharacterStatusCard(
|
||||
character: battleProvider.enemy,
|
||||
isPlayer: false,
|
||||
isTurn: !battleProvider.isPlayerTurn,
|
||||
key: _enemyKey,
|
||||
hideStats: _isEnemyAttacking,
|
||||
),
|
||||
),
|
||||
),
|
||||
// Player (Bottom Left)
|
||||
|
||||
Reference in New Issue
Block a user