From cb15de7e0f5660392597e89c2b65b45b7b31a96a Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Wed, 24 Feb 2021 20:17:28 +0100 Subject: [PATCH] Fix order of parent -> children rendering (#684) * Fix order of parent -> children rendering * Fix import * Move debug rendering * Call renderTree on children too * Component to have renderTree --- CHANGELOG.md | 1 + lib/src/components/base_component.dart | 17 ++++++++++++----- lib/src/components/component.dart | 4 ++++ lib/src/game/base_game.dart | 3 ++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc216ad41..2738d60fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ - Added `toImage` method for the `Sprite` class - Uniform use of `dt` instead of `t` in all update methods - Add more optional arguments for unified constructors of components + - Fix order that parent -> children render in ## 1.0.0-rc6 - Use `Offset` type directly in `JoystickAction.update` calculations diff --git a/lib/src/components/base_component.dart b/lib/src/components/base_component.dart index d6c04f56b..9eb703768 100644 --- a/lib/src/components/base_component.dart +++ b/lib/src/components/base_component.dart @@ -69,15 +69,22 @@ abstract class BaseComponent extends Component { @override void render(Canvas canvas) { prepareCanvas(canvas); + } + @mustCallSuper + @override + void renderTree(Canvas canvas) { + render(canvas); + _children.forEach((c) { + canvas.save(); + c.renderTree(canvas); + canvas.restore(); + }); + + // Any debug rendering should be rendered on top of everything if (debugMode) { renderDebugMode(canvas); } - _children.forEach((c) { - canvas.save(); - c.render(canvas); - canvas.restore(); - }); } void renderDebugMode(Canvas canvas) {} diff --git a/lib/src/components/component.dart b/lib/src/components/component.dart index df2983d2c..3f8a56929 100644 --- a/lib/src/components/component.dart +++ b/lib/src/components/component.dart @@ -46,6 +46,10 @@ abstract class Component { /// Renders this component on the provided Canvas [c]. void render(Canvas c) {} + /// This is used to render this component and potential children on subclasses + /// of [Component] on the provided Canvas [c]. + void renderTree(Canvas c) => render(c); + /// It receives the new game size. /// Executed right after the component is attached to a game and right before [onMount] is called void onGameResize(Vector2 gameSize) {} diff --git a/lib/src/game/base_game.dart b/lib/src/game/base_game.dart index e84eaaf24..85ef1d6e9 100644 --- a/lib/src/game/base_game.dart +++ b/lib/src/game/base_game.dart @@ -4,6 +4,7 @@ import 'package:meta/meta.dart'; import 'package:ordered_set/comparing.dart'; import 'package:ordered_set/ordered_set.dart'; +import '../../components.dart'; import '../components/component.dart'; import '../components/mixins/collidable.dart'; import '../components/mixins/draggable.dart'; @@ -131,7 +132,7 @@ class BaseGame extends Game with FPSCounter { if (!c.isHud) { canvas.translate(-camera.x, -camera.y); } - c.render(canvas); + c.renderTree(canvas); canvas.restore(); canvas.save(); }