mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-10-31 17:06:50 +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);
 | |
|   }
 | |
| }
 | 
