feat: phase 1 of improve

This commit is contained in:
2026-07-08 00:17:46 +03:30
parent 0bd2b4a18a
commit ffd2646eea
6 changed files with 461 additions and 135 deletions
@@ -2,6 +2,7 @@ import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flame/events.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show HapticFeedback;
import '../../../../../core/network/card_images.dart';
import '../../../../../core/theme/app_theme.dart';
@@ -17,6 +18,7 @@ class CardComponent extends PositionComponent
VoidCallback? onPlay; // در صورت مجاز بودن، بازیِ این کارت
bool dimmed; // کارت غیرمجاز/غیرفعال
Vector2? home; // موقعیت اصلی در دست (برای برگشت پس از کشیدنِ ناقص)
bool highlight = false; // کارتِ برنده‌ی دست ⇒ درخششِ طلایی پیش از جمع‌شدن
int restPriority = 0; // ترتیب لایه‌ی اصلی در دست (برای بازگردانی پس از کشیدن)
Rect? dropZone; // ناحیه‌ی وسط میز؛ رهاکردن کارت در آن یعنی بازی
Sprite? _front;
@@ -76,6 +78,15 @@ class CardComponent extends PositionComponent
scale = Vector2.all(1);
}
/// یک «پاپِ» کوتاه (بزرگ‌نماییِ رفت‌وبرگشتی) برای کارتِ برنده‌ی دست.
void pulse() {
children.whereType<ScaleEffect>().toList().forEach((e) => e.removeFromParent());
add(ScaleEffect.to(
Vector2.all(1.16),
EffectController(duration: 0.18, alternate: true, curve: Curves.easeOut),
));
}
@override
void onDragStart(DragStartEvent event) {
super.onDragStart(event);
@@ -101,6 +112,7 @@ class CardComponent extends PositionComponent
// وگرنه برگشت به جای مرتبِ خود.
if (_inDropZone()) {
resetScale();
HapticFeedback.selectionClick(); // بازخوردِ لمسیِ بازیِ کارت
onPlay?.call();
} else {
_scaleTo(1);
@@ -184,6 +196,18 @@ class CardComponent extends PositionComponent
..color = AppColors.suitDark,
);
// درخششِ طلاییِ کارتِ برنده‌ی دست (فقط یک کارت هم‌زمان ⇒ blur ارزان).
if (highlight) {
canvas.drawRRect(
rrect,
Paint()
..style = PaintingStyle.stroke
..strokeWidth = size.x * 0.07
..color = AppColors.gold
..maskFilter = const MaskFilter.blur(BlurStyle.normal, 6),
);
}
// هایلایت طلایی: هنگام کشیدن همیشه (انتخاب)، و پررنگ‌تر روی ناحیه‌ی انداختن.
if (_dragging) {
canvas.drawRRect(