Files
front-hokm/lib/feature/game/presentation/widgets/flame/badges.dart
T
2026-06-24 22:56:32 +03:30

94 lines
2.8 KiB
Dart

import 'dart:math' as math;
import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flutter/material.dart';
import '../../../../../core/theme/app_theme.dart';
const _gold = AppColors.gold;
const _goldDark = Color(0xFF8A5A00); // طلاییِ تیره‌ترِ مخصوصِ نشان‌ها
/// ستاره‌ی طلایی روی بازیکنِ نوبت‌دار (مطابقِ تصویرِ مرجع).
class StarBadge extends PositionComponent {
final double r;
StarBadge(this.r, Vector2 pos)
: super(position: pos, size: Vector2.all(r * 2), anchor: Anchor.center);
static final _fill = Paint()..color = _gold;
static final _stroke = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 1.5
..color = _goldDark;
@override
void render(Canvas canvas) {
final path = _starPath(Offset(r, r), r, r * 0.45, 5);
canvas.drawPath(path, _fill);
canvas.drawPath(path, _stroke);
}
}
/// تاجِ طلایی روی حاکم.
class CrownBadge extends PositionComponent {
final double w;
CrownBadge(this.w, Vector2 pos)
: super(
position: pos,
size: Vector2(w, w * 0.8),
anchor: Anchor.center,
);
static final _fill = Paint()..color = _gold;
static final _stroke = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 1.5
..color = _goldDark;
@override
void render(Canvas canvas) {
final h = size.y;
final p = Path()
..moveTo(0, h) // پایین‌چپ
..lineTo(0, h * 0.35) // نوکِ چپ
..lineTo(w * 0.25, h * 0.62) // فرورفتگی
..lineTo(w * 0.5, h * 0.18) // نوکِ میانی (بلندترین)
..lineTo(w * 0.75, h * 0.62)
..lineTo(w, h * 0.35) // نوکِ راست
..lineTo(w, h) // پایین‌راست
..close();
canvas.drawPath(p, _fill);
canvas.drawPath(p, _stroke);
// نگین‌های نوکِ تاج
final gem = Paint()..color = const Color(0xFFB71C1C);
canvas.drawCircle(Offset(w * 0.5, h * 0.14), w * 0.05, gem);
}
}
Path _starPath(Offset c, double outer, double inner, int points) {
final path = Path();
for (var i = 0; i < points * 2; i++) {
final rad = i.isEven ? outer : inner;
final ang = -math.pi / 2 + i * math.pi / points;
final pt = Offset(c.dx + rad * math.cos(ang), c.dy + rad * math.sin(ang));
i == 0 ? path.moveTo(pt.dx, pt.dy) : path.lineTo(pt.dx, pt.dy);
}
return path..close();
}
/// افکتِ ضربان (برای جلبِ توجه؛ مثلاً ستاره‌ی نوبت).
PulseEffect pulse() => PulseEffect();
class PulseEffect extends ScaleEffect {
PulseEffect()
: super.by(
Vector2.all(0.25),
EffectController(
duration: 0.5,
reverseDuration: 0.5,
infinite: true,
curve: Curves.easeInOut,
),
);
}