mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-10-31 00:48:47 +08:00 
			
		
		
		
	fix: RouterComponent should be on top (#3524)
To get the `WorldRoute` and `world` to work well with other components, the `RouterComponent` needs to be on top. This also fixes a small deprecation in the index.html file for the examples.
This commit is contained in:
		| @ -4,13 +4,14 @@ import 'package:flame/events.dart'; | ||||
| import 'package:flame/game.dart'; | ||||
| import 'package:flame/geometry.dart'; | ||||
| import 'package:flame/rendering.dart'; | ||||
| import 'package:flutter/material.dart' show Colors; | ||||
| import 'package:flutter/rendering.dart'; | ||||
|  | ||||
| class RouterWorldExample extends FlameGame { | ||||
|   static const description = ''' | ||||
|   This example shows how to use the RouterComponent to navigate between | ||||
|   different worlds and pages. | ||||
|   '''; | ||||
| This example shows how to use the RouterComponent to navigate between | ||||
| different worlds and pages. | ||||
| '''; | ||||
|  | ||||
|   late final RouterComponent router; | ||||
|  | ||||
| @ -328,52 +329,55 @@ class Level2Page extends DecoratedWorld with HasGameReference { | ||||
|   } | ||||
| } | ||||
|  | ||||
| class Planet extends PositionComponent { | ||||
| class Planet extends CircleComponent | ||||
|     with TapCallbacks, HasGameReference<RouterWorldExample> { | ||||
|   Planet({ | ||||
|     required this.radius, | ||||
|     required this.color, | ||||
|     super.position, | ||||
|     required super.radius, | ||||
|     required Color color, | ||||
|     super.children, | ||||
|   }) : _paint = Paint()..color = color; | ||||
|  | ||||
|   final double radius; | ||||
|   final Color color; | ||||
|   final Paint _paint; | ||||
|   }) : super(paint: Paint()..color = color, anchor: Anchor.center); | ||||
|  | ||||
|   @override | ||||
|   void render(Canvas canvas) { | ||||
|     canvas.drawCircle(Offset.zero, radius, _paint); | ||||
|   void onTapDown(TapDownEvent event) { | ||||
|     game.router.pushAndWait(YesNoDialog()).then((shouldRemove) { | ||||
|       if (shouldRemove) { | ||||
|         removeFromParent(); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  | ||||
| class Orbit extends PositionComponent { | ||||
| class Orbit extends CircleComponent { | ||||
|   Orbit({ | ||||
|     required this.radius, | ||||
|     required super.radius, | ||||
|     required this.planet, | ||||
|     required this.revolutionPeriod, | ||||
|     double initialAngle = 0, | ||||
|   })  : _paint = Paint() | ||||
|           ..style = PaintingStyle.stroke | ||||
|           ..color = const Color(0x888888aa), | ||||
|         _angle = initialAngle { | ||||
|     add(planet); | ||||
|   } | ||||
|   }) : super( | ||||
|           children: [planet], | ||||
|           anchor: Anchor.center, | ||||
|           paint: Paint() | ||||
|             ..style = PaintingStyle.stroke | ||||
|             ..color = const Color(0x888888aa), | ||||
|         ); | ||||
|  | ||||
|   final double radius; | ||||
|   final double revolutionPeriod; | ||||
|   final Planet planet; | ||||
|   final Paint _paint; | ||||
|   double _angle; | ||||
|  | ||||
|   @override | ||||
|   void render(Canvas canvas) { | ||||
|     canvas.drawCircle(Offset.zero, radius, _paint); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void update(double dt) { | ||||
|     _angle += dt / revolutionPeriod * tau; | ||||
|     planet.position = Vector2(radius, 0)..rotate(_angle); | ||||
|   Future<void> onLoad() async { | ||||
|     super.onLoad(); | ||||
|     if (parent is Planet) { | ||||
|       position = Vector2.all((parent! as Planet).radius); | ||||
|     } | ||||
|     planet.position.x = size.x; | ||||
|     planet.position.y = size.y / 2; | ||||
|     planet.add( | ||||
|       RotateAroundEffect( | ||||
|         tau, | ||||
|         EffectController(duration: revolutionPeriod, infinite: true), | ||||
|         center: size / 2, | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -441,3 +445,43 @@ class DecoratedWorld extends World with HasTimeScale { | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| class YesNoDialog extends ValueRoute<bool> { | ||||
|   YesNoDialog() : super(value: false); | ||||
|  | ||||
|   @override | ||||
|   Component build() { | ||||
|     final gameSize = findGame()!.size; | ||||
|     const margin = 10.0; | ||||
|     final boxSize = Vector2(350, 100); | ||||
|     return PositionComponent( | ||||
|       position: Vector2(gameSize.x / 2, margin), | ||||
|       size: boxSize, | ||||
|       anchor: Anchor.topCenter, | ||||
|       children: [ | ||||
|         RectangleComponent( | ||||
|           size: boxSize, | ||||
|           paint: Paint()..color = const Color(0xFFAA0000), | ||||
|         ), | ||||
|         TextComponent( | ||||
|           position: Vector2.all(margin), | ||||
|           text: 'Remove the planet?', | ||||
|         ), | ||||
|         RoundedButton( | ||||
|           text: 'Yes', | ||||
|           action: () => completeWith(true), | ||||
|           color: Colors.green, | ||||
|           borderColor: Colors.white, | ||||
|           position: Vector2(boxSize.x / 4, boxSize.y - 30), | ||||
|         ), | ||||
|         RoundedButton( | ||||
|           text: 'No', | ||||
|           action: () => completeWith(false), | ||||
|           color: Colors.red, | ||||
|           borderColor: Colors.white, | ||||
|           position: Vector2(boxSize.x * 0.75, boxSize.y - 30), | ||||
|         ), | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -19,16 +19,6 @@ | ||||
|   <link rel="manifest" href="manifest.json"> | ||||
| </head> | ||||
| <body> | ||||
|   <!-- This script installs service_worker.js to provide PWA functionality to | ||||
|        application. For more information, see: | ||||
|        https://developers.google.com/web/fundamentals/primers/service-workers --> | ||||
|   <script> | ||||
|     if ('serviceWorker' in navigator) { | ||||
|       window.addEventListener('load', function () { | ||||
|         navigator.serviceWorker.register('flutter_service_worker.js'); | ||||
|       }); | ||||
|     } | ||||
|   </script> | ||||
|   <script src="main.dart.js" type="application/javascript"></script> | ||||
|   <script src="flutter_bootstrap.js" async></script> | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
| @ -34,6 +34,7 @@ class RouterComponent extends Component { | ||||
|     Map<String, RouteFactory>? routeFactories, | ||||
|     this.onUnknownRoute, | ||||
|     super.key, | ||||
|     super.priority = 0x7fffffff, | ||||
|   })  : _routes = routes, | ||||
|         _routeFactories = routeFactories ?? {} { | ||||
|     routes.forEach((name, route) => route.name = name); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Lukas Klingsbo
					Lukas Klingsbo