Index: sky/examples/game/lib/sprite_box.dart |
diff --git a/sky/examples/game/lib/sprite_box.dart b/sky/examples/game/lib/sprite_box.dart |
index 6e7b6868f401bdd48d09aeb99e904246ad3f3992..7c95ee79d9066d2f80aaf437f2211e518fe1f458 100644 |
--- a/sky/examples/game/lib/sprite_box.dart |
+++ b/sky/examples/game/lib/sprite_box.dart |
@@ -11,8 +11,10 @@ enum SpriteBoxTransformMode { |
class SpriteBox extends RenderBox { |
+ // Member variables |
+ |
// Root node for drawing |
- TransformNode _rootNode; |
+ Node _rootNode; |
// Tracking of frame rate and updates |
double _lastTimeStamp; |
@@ -22,7 +24,9 @@ class SpriteBox extends RenderBox { |
double _systemWidth; |
double _systemHeight; |
- SpriteBox(TransformNode rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode.nativePoints, double width=1024.0, double height=1024.0]) { |
+ // Setup |
+ |
+ SpriteBox(Node rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode.nativePoints, double width=1024.0, double height=1024.0]) { |
assert(rootNode != null); |
assert(rootNode._spriteBox == null); |
@@ -40,30 +44,31 @@ class SpriteBox extends RenderBox { |
_scheduleTick(); |
} |
- void _addSpriteBoxReference(TransformNode node) { |
+ void _addSpriteBoxReference(Node node) { |
node._spriteBox = this; |
- for (TransformNode child in node._children) { |
+ for (Node child in node._children) { |
_addSpriteBoxReference(child); |
} |
} |
+ // Properties |
+ |
double get systemWidth => _systemWidth; |
double get systemHeight => _systemHeight; |
- TransformNode get rootNode => _rootNode; |
+ Node get rootNode => _rootNode; |
void performLayout() { |
size = constraints.constrain(Size.infinite); |
} |
+ // Event handling |
+ |
void handleEvent(Event event, BoxHitTestEntry entry) { |
- switch (event.type) { |
- case 'pointerdown': |
- print("pointerdown"); |
- break; |
- } |
} |
+ // Rendering |
+ |
void paint(RenderObjectDisplayList canvas) { |
// Move to correct coordinate space before drawing |
double scaleX = 1.0; |
@@ -104,7 +109,6 @@ class SpriteBox extends RenderBox { |
scaleX = size.width/_systemWidth; |
scaleY = scaleX; |
_systemHeight = size.height/scaleX; |
- print("systemHeight: $_systemHeight"); |
break; |
case SpriteBoxTransformMode.fixedHeight: |
scaleY = size.height/_systemHeight; |
@@ -129,6 +133,8 @@ class SpriteBox extends RenderBox { |
canvas.restore(); |
} |
+ // Updates |
+ |
int _animationId = 0; |
void _scheduleTick() { |
@@ -151,4 +157,29 @@ class SpriteBox extends RenderBox { |
_rootNode.update(delta); |
_scheduleTick(); |
} |
+ |
+ // Hit tests |
+ |
+ List<Node> findNodesAtPosition(Point position) { |
+ assert(position != null); |
+ |
+ List<Node> nodes = []; |
+ |
+ // Traverse the render tree and find objects at the position |
+ _addNodesAtPosition(_rootNode, position, nodes); |
+ |
+ return nodes; |
+ } |
+ |
+ _addNodesAtPosition(Node node, Point position, List<Node> list) { |
+ // Visit children first |
+ for (Node child in node.children) { |
+ _addNodesAtPosition(child, position, list); |
+ } |
+ // Do the hit test |
+ Point posInNodeSpace = node.convertPointToNodeSpace(position); |
+ if (node.hitTest(posInNodeSpace)) { |
+ list.add(node); |
+ } |
+ } |
} |