priority of cards fixed

This commit is contained in:
2026-06-19 21:35:23 +03:30
parent c4c1453f7e
commit 04b97ca163
3 changed files with 106 additions and 29 deletions
@@ -2,15 +2,18 @@ import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flutter/material.dart';
/// انیمیشنِ بُر زدن: دو دسته کارتِ پشت‌رو در مرکز ریفل می‌شوند، کمی بالا/پایین
/// می‌روند (بُر) و سپس به سمت چهار بازیکن پخش می‌شوند. مدتِ کل [totalMs] است
/// تا صدای بُر زدن دقیقاً هم‌زمان با پایانِ انیمیشن قطع شود.
/// انیمیشنِ پخشِ کارت.
/// - حالتِ بُر زدن ([dealOnly]=false): دو دسته در مرکز ریفل و سپس پخش می‌شوند.
/// - حالتِ پخش ([dealOnly]=true): کارت‌ها از مرکز به سمتِ چهار بازیکن پخش می‌شوند
/// (پس از انتخابِ حکم، برای پخشِ بقیه‌ی کارت‌ها).
class ShuffleAnimation extends PositionComponent {
final Vector2 area;
ShuffleAnimation(this.area);
final bool dealOnly;
ShuffleAnimation(this.area, {this.dealOnly = false});
/// مدتِ کلِ انیمیشن (مرجعِ هماهنگیِ صدا).
/// مدتِ کلِ هر حالت (مرجعِ هماهنگیِ صدا).
static const int totalMs = 2000;
static const int dealMs = 1300;
@override
Future<void> onLoad() async {
@@ -29,24 +32,41 @@ class ShuffleAnimation extends PositionComponent {
];
for (var i = 0; i < n; i++) {
final left = i.isEven;
final stack = center + Vector2((i - n / 2) * cw * 0.05, 0);
final delay = i * 0.02; // ریفلِ پلکانی
final delay = i * 0.02;
if (dealOnly) {
// فقط پخش: از یک دسته‌ی مرتب در مرکز به سمتِ بازیکن‌ها.
final card = _Back(Vector2(cw, ch))
..anchor = Anchor.center
..position = stack;
add(card);
card.add(MoveToEffect(
center + dirs[i % 4],
EffectController(
duration: 0.45, curve: Curves.easeIn, startDelay: 0.15 + delay),
));
card.add(ScaleEffect.to(
Vector2.all(0.5),
EffectController(duration: 0.45, startDelay: 0.15 + delay),
));
continue;
}
// حالتِ بُر زدن: ریفل سپس پخش.
final left = i.isEven;
final card = _Back(Vector2(cw, ch))
..anchor = Anchor.center
..position = center + Vector2((left ? -1 : 1) * cw, 0)
..angle = (left ? -1 : 1) * 0.22;
add(card);
// صاف‌شدنِ زاویه هم‌زمان با ریفل.
card.add(RotateEffect.to(
0, EffectController(duration: 0.55, startDelay: delay)));
// دنباله: ریفل به مرکز ← بالا (بُر) ← نشستن ← پخش به سمت بازیکن.
card.add(SequenceEffect([
MoveToEffect(stack,
EffectController(duration: 0.55, curve: Curves.easeOut, startDelay: delay)),
EffectController(
duration: 0.55, curve: Curves.easeOut, startDelay: delay)),
MoveToEffect(stack + Vector2(0, -ch * 0.18),
EffectController(duration: 0.35, curve: Curves.easeInOut)),
MoveToEffect(stack,
@@ -54,15 +74,13 @@ class ShuffleAnimation extends PositionComponent {
MoveToEffect(center + dirs[i % 4],
EffectController(duration: 0.55, curve: Curves.easeIn)),
]));
// کوچک‌شدن هنگامِ پخش (هم‌زمان با حرکتِ آخرِ دنباله).
card.add(ScaleEffect.to(
Vector2.all(0.5),
EffectController(duration: 0.55, startDelay: 1.25 + delay),
));
}
add(RemoveEffect(delay: totalMs / 1000));
add(RemoveEffect(delay: (dealOnly ? dealMs : totalMs) / 1000));
}
}