94 lines
2.8 KiB
Dart
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,
|
|
),
|
|
);
|
|
}
|