mirror of
https://github.com/flame-engine/flame.git
synced 2025-10-31 00:48:47 +08:00
58 lines
1.2 KiB
Dart
58 lines
1.2 KiB
Dart
import 'package:flutter/widgets.dart';
|
|
import 'package:meta/meta.dart';
|
|
import '../sprite.dart';
|
|
|
|
import 'dart:math';
|
|
|
|
class SpriteWidget extends StatelessWidget {
|
|
final Sprite sprite;
|
|
final bool center;
|
|
|
|
SpriteWidget({
|
|
@required this.sprite,
|
|
this.center = false,
|
|
}) : assert(sprite.loaded(), 'Sprite must be loaded');
|
|
|
|
@override
|
|
Widget build(_) {
|
|
return Container(
|
|
child: CustomPaint(painter: _FlameSpritePainer(sprite, center)),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _FlameSpritePainer extends CustomPainter {
|
|
final Sprite _sprite;
|
|
final bool _center;
|
|
|
|
_FlameSpritePainer(this._sprite, this._center);
|
|
|
|
@override
|
|
bool shouldRepaint(_FlameSpritePainer old) =>
|
|
old._sprite != _sprite || old._center != _center;
|
|
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
final widthRate = size.width / _sprite.size.x;
|
|
final heightRate = size.height / _sprite.size.y;
|
|
|
|
final rate = min(widthRate, heightRate);
|
|
|
|
final rect = Rect.fromLTWH(
|
|
0,
|
|
0,
|
|
_sprite.size.x * rate,
|
|
_sprite.size.y * rate,
|
|
);
|
|
|
|
if (_center) {
|
|
canvas.translate(
|
|
size.width / 2 - rect.width / 2,
|
|
size.height / 2 - rect.height / 2,
|
|
);
|
|
}
|
|
|
|
_sprite.renderRect(canvas, rect);
|
|
}
|
|
}
|