mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-10-31 17:06:50 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/foundation.dart';
 | |
| import 'package:flutter/widgets.dart' as widgets;
 | |
| import 'package:meta/meta.dart';
 | |
| import '../sprite.dart';
 | |
| import 'dart:ui';
 | |
| 
 | |
| class _Painter extends widgets.CustomPainter {
 | |
|   final Image image;
 | |
|   final double tileSize;
 | |
|   final double destTileSize;
 | |
| 
 | |
|   _Painter({
 | |
|     @required this.image,
 | |
|     @required this.tileSize,
 | |
|     @required this.destTileSize,
 | |
|   });
 | |
| 
 | |
|   Sprite _getSpriteTile(double x, double y) =>
 | |
|       Sprite.fromImage(image, x: x, y: y, width: tileSize, height: tileSize);
 | |
| 
 | |
|   @override
 | |
|   void paint(Canvas canvas, Size size) {
 | |
|     final topLeftCorner = _getSpriteTile(0, 0);
 | |
|     final topRightCorner = _getSpriteTile(tileSize * 2, 0);
 | |
| 
 | |
|     final bottomLeftCorner = _getSpriteTile(0, 2 * tileSize);
 | |
|     final bottomRightCorner = _getSpriteTile(tileSize * 2, 2 * tileSize);
 | |
| 
 | |
|     final topSide = _getSpriteTile(tileSize, 0);
 | |
|     final bottomSide = _getSpriteTile(tileSize, tileSize * 2);
 | |
| 
 | |
|     final leftSide = _getSpriteTile(0, tileSize);
 | |
|     final rightSide = _getSpriteTile(tileSize * 2, tileSize);
 | |
| 
 | |
|     final middle = _getSpriteTile(tileSize, tileSize);
 | |
| 
 | |
|     final horizontalWidget = size.width - destTileSize * 2;
 | |
|     final verticalHeight = size.height - destTileSize * 2;
 | |
| 
 | |
|     // Middle
 | |
|     middle.renderRect(
 | |
|         canvas,
 | |
|         Rect.fromLTWH(
 | |
|           destTileSize,
 | |
|           destTileSize,
 | |
|           horizontalWidget,
 | |
|           verticalHeight,
 | |
|         ));
 | |
| 
 | |
|     // Top and bottom side
 | |
|     topSide.renderRect(
 | |
|         canvas, Rect.fromLTWH(destTileSize, 0, horizontalWidget, destTileSize));
 | |
| 
 | |
|     bottomSide.renderRect(
 | |
|         canvas,
 | |
|         Rect.fromLTWH(destTileSize, size.height - destTileSize,
 | |
|             horizontalWidget, destTileSize));
 | |
| 
 | |
|     // Left and right side
 | |
|     leftSide.renderRect(
 | |
|         canvas, Rect.fromLTWH(0, destTileSize, destTileSize, verticalHeight));
 | |
|     rightSide.renderRect(
 | |
|         canvas,
 | |
|         Rect.fromLTWH(size.width - destTileSize, destTileSize, destTileSize,
 | |
|             verticalHeight));
 | |
| 
 | |
|     // Corners
 | |
|     topLeftCorner.renderRect(
 | |
|         canvas, Rect.fromLTWH(0, 0, destTileSize, destTileSize));
 | |
|     topRightCorner.renderRect(
 | |
|         canvas,
 | |
|         Rect.fromLTWH(
 | |
|             size.width - destTileSize, 0, destTileSize, destTileSize));
 | |
| 
 | |
|     bottomLeftCorner.renderRect(
 | |
|         canvas,
 | |
|         Rect.fromLTWH(
 | |
|             0, size.height - destTileSize, destTileSize, destTileSize));
 | |
|     bottomRightCorner.renderRect(
 | |
|         canvas,
 | |
|         Rect.fromLTWH(size.width - destTileSize, size.height - destTileSize,
 | |
|             destTileSize, destTileSize));
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   bool shouldRepaint(_) => false;
 | |
| }
 | |
| 
 | |
| class NineTileBox extends widgets.StatelessWidget {
 | |
|   final Image image;
 | |
|   final double tileSize;
 | |
|   final double destTileSize;
 | |
|   final double width;
 | |
|   final double height;
 | |
| 
 | |
|   final widgets.Widget child;
 | |
| 
 | |
|   final widgets.EdgeInsetsGeometry padding;
 | |
| 
 | |
|   NineTileBox({
 | |
|     @required this.image,
 | |
|     @required this.tileSize,
 | |
|     @required this.destTileSize,
 | |
|     Key key,
 | |
|     this.child,
 | |
|     this.width,
 | |
|     this.height,
 | |
|     this.padding,
 | |
|   }) : super(key: key);
 | |
| 
 | |
|   @override
 | |
|   widgets.Widget build(widgets.BuildContext context) {
 | |
|     return widgets.Container(
 | |
|       width: width,
 | |
|       height: height,
 | |
|       child: widgets.CustomPaint(
 | |
|         painter: _Painter(
 | |
|           image: image,
 | |
|           tileSize: tileSize,
 | |
|           destTileSize: destTileSize,
 | |
|         ),
 | |
|         child: widgets.Container(
 | |
|           child: child,
 | |
|           padding: padding,
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 | 
