diff --git a/sky/packages/sky/example/game/lib/node.dart b/sky/packages/sky/example/game/lib/node.dart index 03027066d29..97eb09ea2a0 100644 --- a/sky/packages/sky/example/game/lib/node.dart +++ b/sky/packages/sky/example/game/lib/node.dart @@ -65,6 +65,7 @@ class Node { ActionController get actions { if (_actions == null) { _actions = new ActionController(); + if (_spriteBox != null) _spriteBox._actionControllers = null; } return _actions; } @@ -201,7 +202,7 @@ class Node { child._spriteBox = this._spriteBox; _childrenLastAddedOrder += 1; child._addedOrder = _childrenLastAddedOrder; - if (_spriteBox != null) _spriteBox._eventTargets = null; + if (_spriteBox != null) _spriteBox._registerNode(child); } /// Removes a child from this node. @@ -212,7 +213,7 @@ class Node { if (_children.remove(child)) { child._parent = null; child._spriteBox = null; - if (_spriteBox != null) _spriteBox._eventTargets = null; + if (_spriteBox != null) _spriteBox._deregisterNode(child); } } @@ -234,7 +235,7 @@ class Node { } _children = []; _childrenNeedSorting = false; - if (_spriteBox != null) _spriteBox._eventTargets = null; + if (_spriteBox != null) _spriteBox._deregisterNode(null); } void _sortChildren() { diff --git a/sky/packages/sky/example/game/lib/sprite_box.dart b/sky/packages/sky/example/game/lib/sprite_box.dart index 736e5e3a8f4..f9b03cdd4a0 100644 --- a/sky/packages/sky/example/game/lib/sprite_box.dart +++ b/sky/packages/sky/example/game/lib/sprite_box.dart @@ -71,6 +71,8 @@ class SpriteBox extends RenderBox { List _eventTargets; + List _actionControllers; + Rect _visibleArea; Rect get visibleArea { @@ -131,6 +133,18 @@ class SpriteBox extends RenderBox { _callSpriteBoxPerformedLayout(_rootNode); } + // Adding and removing nodes + + _registerNode(Node node) { + _actionControllers = null; + _eventTargets = null; + } + + _deregisterNode(Node node) { + _actionControllers = null; + _eventTargets = null; + } + // Event handling void _addEventTargets(Node node, List eventTargets) { @@ -342,19 +356,32 @@ class SpriteBox extends RenderBox { // if (_numFrames % 60 == 0) // print("delta: $delta fps: $_frameRate"); - _runActions(_rootNode, delta); + _runActions(delta); _callUpdate(_rootNode, delta); + + // Schedule next update _scheduleTick(); + + // Make sure the node graph is redrawn markNeedsPaint(); } - void _runActions(Node node, double dt) { - if (node._actions != null) { - node._actions.step(dt); + void _runActions(double dt) { + if (_actionControllers == null) { + _actionControllers = []; + _addActionControllers(_rootNode, _actionControllers); } + for (ActionController actions in _actionControllers) { + actions.step(dt); + } + } + + void _addActionControllers(Node node, List controllers) { + if (node._actions != null) controllers.add(node._actions); + for (int i = node.children.length - 1; i >= 0; i--) { Node child = node.children[i]; - _runActions(child, dt); + _addActionControllers(child, controllers); } }