Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: sky/examples/game/lib/sprite_box.dart

Issue 1179413009: Adds basic touch handling to sprites and optimizes transformations (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sky/examples/game/lib/sprite.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 part of sprites; 1 part of sprites;
2 2
3 enum SpriteBoxTransformMode { 3 enum SpriteBoxTransformMode {
4 nativePoints, 4 nativePoints,
5 letterbox, 5 letterbox,
6 stretch, 6 stretch,
7 scaleToFit, 7 scaleToFit,
8 fixedWidth, 8 fixedWidth,
9 fixedHeight, 9 fixedHeight,
10 } 10 }
(...skipping 10 matching lines...) Expand all
21 int _numFrames = 0; 21 int _numFrames = 0;
22 double _frameRate = 0.0; 22 double _frameRate = 0.0;
23 23
24 // Transformation mode 24 // Transformation mode
25 SpriteBoxTransformMode transformMode; 25 SpriteBoxTransformMode transformMode;
26 double _systemWidth; 26 double _systemWidth;
27 double _systemHeight; 27 double _systemHeight;
28 28
29 // Cached transformation matrix 29 // Cached transformation matrix
30 Matrix4 _transformMatrix; 30 Matrix4 _transformMatrix;
31 bool _transformMatrixIsDirty; 31
32 List<Node> _eventTargets;
32 33
33 // Setup 34 // Setup
34 35
35 SpriteBox(Node rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode .nativePoints, double width=1024.0, double height=1024.0]) { 36 SpriteBox(Node rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode .nativePoints, double width=1024.0, double height=1024.0]) {
36 assert(rootNode != null); 37 assert(rootNode != null);
37 assert(rootNode._spriteBox == null); 38 assert(rootNode._spriteBox == null);
38 39
39 // Setup root node 40 // Setup root node
40 _rootNode = rootNode; 41 _rootNode = rootNode;
41 42
42 // Assign SpriteBox reference to all the nodes 43 // Assign SpriteBox reference to all the nodes
43 _addSpriteBoxReference(_rootNode); 44 _addSpriteBoxReference(_rootNode);
44 45
45 // Setup transform mode 46 // Setup transform mode
46 transformMode = mode; 47 transformMode = mode;
47 _systemWidth = width; 48 _systemWidth = width;
48 _systemHeight = height; 49 _systemHeight = height;
49 50
50 _transformMatrixIsDirty = true;
51
52 _scheduleTick(); 51 _scheduleTick();
53 } 52 }
54 53
55 void _addSpriteBoxReference(Node node) { 54 void _addSpriteBoxReference(Node node) {
56 node._spriteBox = this; 55 node._spriteBox = this;
57 for (Node child in node._children) { 56 for (Node child in node._children) {
58 _addSpriteBoxReference(child); 57 _addSpriteBoxReference(child);
59 } 58 }
60 } 59 }
61 60
62 // Properties 61 // Properties
63 62
64 double get systemWidth => _systemWidth; 63 double get systemWidth => _systemWidth;
65 double get systemHeight => _systemHeight; 64 double get systemHeight => _systemHeight;
66 65
67 Node get rootNode => _rootNode; 66 Node get rootNode => _rootNode;
68 67
69 void performLayout() { 68 void performLayout() {
70 size = constraints.constrain(Size.infinite); 69 size = constraints.constrain(Size.infinite);
71 _transformMatrixIsDirty = true; 70 _invalidateTransformMatrix();
72 _callSpriteBoxPerformedLayout(_rootNode); 71 _callSpriteBoxPerformedLayout(_rootNode);
73 } 72 }
74 73
75 // Event handling 74 // Event handling
76 75
77 void handleEvent(Event event, BoxHitTestEntry entry) { 76 void _addEventTargets(Node node, List<Node> eventTargets) {
77 if (node.userInteractionEnabled) {
78 eventTargets.add(node);
79 }
80 for (Node child in node.children) {
81 _addEventTargets(child, eventTargets);
82 }
83 }
84
85 void handleEvent(Event event, SpriteBoxHitTestEntry entry) {
86 if (event is PointerEvent) {
87
88 if (event.type == 'pointerdown') {
89 // Build list of event targets
90 if (_eventTargets == null) {
91 _eventTargets = [];
92 _addEventTargets(_rootNode, _eventTargets);
93 }
94
95 // Find the once that are hit by the pointer
96 List<Node> nodeTargets = [];
97 for (int i = _eventTargets.length - 1; i >= 0; i--) {
98 Node node = _eventTargets[i];
99
100 // Check if the node is ready to handle a pointer
101 if (node.handleMultiplePointers || node._handlingPointer == null) {
102 // Do the hit test
103 Point posInNodeSpace = node.convertPointToNodeSpace(entry.localPosit ion);
104 if (node.hitTest(posInNodeSpace)) {
abarth-chromium 2015/06/18 21:19:21 Do you want to move this work into the |hitTest| f
105 nodeTargets.add(node);
106 node._handlingPointer = event.pointer;
107 }
108 }
109 }
110
111 entry.nodeTargets = nodeTargets;
112 }
113
114 // Pass the event down to nodes that were hit by the pointerdown
115 List<Node> targets = entry.nodeTargets;
116 for (Node node in targets) {
117 // Check if this event should be dispatched
118 if (node.handleMultiplePointers || event.pointer == node._handlingPointe r) {
119 // Dispatch event
120 bool consumedEvent = node.handleEvent(new SpriteBoxEvent(new Point(eve nt.x, event.y), event.type, event.pointer));
121 if (consumedEvent == null || consumedEvent) break;
122 }
123 }
124
125 // De-register pointer for nodes that doesn't handle multiple pointers
126 for (Node node in targets) {
127 if (event.type == 'pointerup' || event.type == 'pointercancel') {
128 node._handlingPointer = null;
129 }
130 }
131 }
132 }
133
134 bool hitTest(HitTestResult result, { Point position }) {
135 result.add(new SpriteBoxHitTestEntry(this, position));
136 return true;
78 } 137 }
79 138
80 // Rendering 139 // Rendering
81 140
82 Matrix4 get transformMatrix { 141 Matrix4 get transformMatrix {
83 // Get cached matrix if available 142 // Get cached matrix if available
84 if (!_transformMatrixIsDirty && _transformMatrix != null) { 143 if (_transformMatrix != null) {
85 return _transformMatrix; 144 return _transformMatrix;
86 } 145 }
87 146
88 _transformMatrix = new Matrix4.identity(); 147 _transformMatrix = new Matrix4.identity();
89 148
90 // Calculate matrix 149 // Calculate matrix
91 double scaleX = 1.0; 150 double scaleX = 1.0;
92 double scaleY = 1.0; 151 double scaleY = 1.0;
93 double offsetX = 0.0; 152 double offsetX = 0.0;
94 double offsetY = 0.0; 153 double offsetY = 0.0;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 assert(false); 197 assert(false);
139 break; 198 break;
140 } 199 }
141 200
142 _transformMatrix.translate(offsetX, offsetY); 201 _transformMatrix.translate(offsetX, offsetY);
143 _transformMatrix.scale(scaleX, scaleY); 202 _transformMatrix.scale(scaleX, scaleY);
144 203
145 return _transformMatrix; 204 return _transformMatrix;
146 } 205 }
147 206
207 void _invalidateTransformMatrix() {
208 _transformMatrix = null;
209 _rootNode._invalidateToBoxTransformMatrix();
210 }
211
148 void paint(RenderObjectDisplayList canvas) { 212 void paint(RenderObjectDisplayList canvas) {
149 canvas.save(); 213 canvas.save();
150 214
151 // Move to correct coordinate space before drawing 215 // Move to correct coordinate space before drawing
152 canvas.concat(transformMatrix.storage); 216 canvas.concat(transformMatrix.storage);
153 217
154 // Draw the sprite tree 218 // Draw the sprite tree
155 _rootNode.visit(canvas); 219 _rootNode.visit(canvas);
156 220
157 canvas.restore(); 221 canvas.restore();
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 for (Node child in node.children) { 282 for (Node child in node.children) {
219 _addNodesAtPosition(child, position, list); 283 _addNodesAtPosition(child, position, list);
220 } 284 }
221 // Do the hit test 285 // Do the hit test
222 Point posInNodeSpace = node.convertPointToNodeSpace(position); 286 Point posInNodeSpace = node.convertPointToNodeSpace(position);
223 if (node.hitTest(posInNodeSpace)) { 287 if (node.hitTest(posInNodeSpace)) {
224 list.add(node); 288 list.add(node);
225 } 289 }
226 } 290 }
227 } 291 }
292
293 class SpriteBoxHitTestEntry extends BoxHitTestEntry {
294 List<Node> nodeTargets;
295 SpriteBoxHitTestEntry(RenderBox target, Point localPosition) : super(target, l ocalPosition);
296 }
297
298 class SpriteBoxEvent {
299 Point boxPosition;
300 String type;
301 int pointer;
302
303 SpriteBoxEvent(this.boxPosition, this.type, this.pointer);
304 }
OLDNEW
« no previous file with comments | « sky/examples/game/lib/sprite.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698