From b26bae8a45d5812eb9341a5100478ffa92a471cd Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Tue, 21 Jul 2015 16:42:51 -0700 Subject: [PATCH] Fixes issues with invalidating matrix for SpriteBox --- .../flutter/example/game/lib/sprite_box.dart | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/flutter/example/game/lib/sprite_box.dart b/packages/flutter/example/game/lib/sprite_box.dart index c35d9e90cf..aa180c4875 100644 --- a/packages/flutter/example/game/lib/sprite_box.dart +++ b/packages/flutter/example/game/lib/sprite_box.dart @@ -39,6 +39,7 @@ class SpriteBox extends RenderBox { // Add new references _addSpriteBoxReference(_rootNode); + markNeedsLayout(); } // Tracking of frame rate and updates @@ -55,7 +56,7 @@ class SpriteBox extends RenderBox { _transformMode = value; // Invalidate stuff - if (attached) performLayout(); + markNeedsLayout(); } /// The transform mode used by the [SpriteBox]. @@ -68,7 +69,10 @@ class SpriteBox extends RenderBox { Rect _visibleArea; - Rect get visibleArea => _visibleArea; + Rect get visibleArea { + if (_visibleArea == null) _calcTransformMatrix(); + return _visibleArea; + } // Setup @@ -150,6 +154,8 @@ class SpriteBox extends RenderBox { } void handleEvent(Event event, _SpriteBoxHitTestEntry entry) { + if (!attached) return; + if (event is PointerEvent) { if (event.type == 'pointerdown') { @@ -212,10 +218,13 @@ class SpriteBox extends RenderBox { /// var matrix = mySpriteBox.transformMatrix; Matrix4 get transformMatrix { // Get cached matrix if available - if (_transformMatrix != null) { - return _transformMatrix; + if (_transformMatrix == null) { + _calcTransformMatrix(); } + return _transformMatrix; + } + void _calcTransformMatrix() { _transformMatrix = new Matrix4.identity(); // Calculate matrix @@ -273,13 +282,17 @@ class SpriteBox extends RenderBox { break; } + _visibleArea = new Rect.fromLTRB(-offsetX / scaleX, + -offsetY / scaleY, + systemWidth + offsetX / scaleX, + systemHeight + offsetY / scaleY); + _transformMatrix.translate(offsetX, offsetY); _transformMatrix.scale(scaleX, scaleY); - - return _transformMatrix; } void _invalidateTransformMatrix() { + _visibleArea = null; _transformMatrix = null; _rootNode._invalidateToBoxTransformMatrix(); }