feat: add heart beat for timing

This commit is contained in:
2026-06-19 02:28:07 +03:30
parent a4cf2b5f39
commit c4c1453f7e
6 changed files with 476 additions and 246 deletions
@@ -4,7 +4,8 @@ import 'package:flame/components.dart';
import 'package:flutter/material.dart';
/// حلقه‌ی شمارشِ معکوسِ نوبت: کمانی که در طولِ مهلتِ نوبت خالی می‌شود.
/// رنگ از طلایی به قرمز می‌رود و در ثانیه‌های پایانی هشدار می‌دهد.
/// در ثانیه‌های پایانی قرمز و ضربان‌دار می‌شود. (صدای ضربانِ قلب در HokmGame
/// مدیریت می‌شود تا هنگامِ بازی‌شدنِ کارت بلافاصله قطع شود.)
class TurnTimer extends PositionComponent {
final double radius;
final double durationSeconds;
@@ -20,6 +21,8 @@ class TurnTimer extends PositionComponent {
anchor: Anchor.center,
);
double get _warnSecs => math.min(8.0, durationSeconds * 0.4);
static final _bg = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 3
@@ -28,6 +31,13 @@ class TurnTimer extends PositionComponent {
@override
void update(double dt) {
_elapsed += dt;
final remaining = durationSeconds - _elapsed;
// ضربانِ تصویری در پنجره‌ی هشدار.
if (remaining > 0 && remaining <= _warnSecs) {
scale = Vector2.all(1 + 0.18 * math.sin(_elapsed * 2 * math.pi / 0.7).abs());
} else {
scale = Vector2.all(1);
}
}
@override
@@ -35,11 +45,12 @@ class TurnTimer extends PositionComponent {
final center = Offset(radius, radius);
canvas.drawCircle(center, radius, _bg);
final frac =
durationSeconds <= 0 ? 0.0 : (1 - _elapsed / durationSeconds).clamp(0.0, 1.0);
final frac = durationSeconds <= 0
? 0.0
: (1 - _elapsed / durationSeconds).clamp(0.0, 1.0);
if (frac <= 0) return;
final color = frac > 0.3 ? const Color(0xFFE9B949) : const Color(0xFFE53935);
final color = frac > 0.35 ? const Color(0xFFE9B949) : const Color(0xFFE53935);
final arc = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 4
@@ -47,7 +58,7 @@ class TurnTimer extends PositionComponent {
..color = color;
canvas.drawArc(
Rect.fromCircle(center: center, radius: radius),
-math.pi / 2, // شروع از بالا
-math.pi / 2,
2 * math.pi * frac,
false,
arc,