mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-11-04 04:47:13 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flame/widgets/animation_widget.dart';
 | 
						|
import 'package:flutter/widgets.dart';
 | 
						|
import 'package:meta/meta.dart';
 | 
						|
import 'dart:math';
 | 
						|
 | 
						|
import '../sprite.dart';
 | 
						|
import '../anchor.dart';
 | 
						|
 | 
						|
/// A [StatefulWidget] that renders a still [Sprite].
 | 
						|
///
 | 
						|
/// To render an animation, use [SpriteAnimationWidget].
 | 
						|
class SpriteWidget extends StatelessWidget {
 | 
						|
  /// The [Sprite] to be rendered
 | 
						|
  final Sprite sprite;
 | 
						|
 | 
						|
  /// The positioning [Anchor] for the [sprite]
 | 
						|
  final Anchor anchor;
 | 
						|
 | 
						|
  SpriteWidget({
 | 
						|
    @required this.sprite,
 | 
						|
    this.anchor = Anchor.topLeft,
 | 
						|
  }) : assert(sprite.loaded(), 'Sprite must be loaded');
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(_) {
 | 
						|
    return Container(
 | 
						|
      child: CustomPaint(painter: _SpritePainter(sprite, anchor)),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class _SpritePainter extends CustomPainter {
 | 
						|
  final Sprite _sprite;
 | 
						|
  final Anchor _anchor;
 | 
						|
 | 
						|
  _SpritePainter(this._sprite, this._anchor);
 | 
						|
 | 
						|
  @override
 | 
						|
  bool shouldRepaint(_SpritePainter old) {
 | 
						|
    return old._sprite != _sprite || old._anchor != _anchor;
 | 
						|
  }
 | 
						|
 | 
						|
  @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 w = _sprite.size.x * rate;
 | 
						|
    final h = _sprite.size.y * rate;
 | 
						|
 | 
						|
    final double dx = _anchor.relativePosition.x * size.width;
 | 
						|
    final double dy = _anchor.relativePosition.y * size.height;
 | 
						|
 | 
						|
    canvas.translate(
 | 
						|
      dx - w * _anchor.relativePosition.x,
 | 
						|
      dy - h * _anchor.relativePosition.y,
 | 
						|
    );
 | 
						|
 | 
						|
    _sprite.render(canvas, width: w, height: h);
 | 
						|
  }
 | 
						|
}
 |