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

Unified Diff: sky/examples/game/lib/sprite_box.dart

Issue 1179333002: Playable demo game and bug fixes in sprites (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 side-by-side diff with in-line comments
Download patch
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 7c95ee79d9066d2f80aaf437f2211e518fe1f458..59311f6d749a5ac5277443830f90ce5bda559879 100644
--- a/sky/examples/game/lib/sprite_box.dart
+++ b/sky/examples/game/lib/sprite_box.dart
@@ -19,11 +19,17 @@ class SpriteBox extends RenderBox {
// Tracking of frame rate and updates
double _lastTimeStamp;
int _numFrames = 0;
+ double _frameRate = 0.0;
+ // Transformation mode
SpriteBoxTransformMode transformMode;
double _systemWidth;
double _systemHeight;
+ // Cached transformation matrix
+ Matrix4 _transformMatrix;
+ bool _transformMatrixIsDirty;
+
// Setup
SpriteBox(Node rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode.nativePoints, double width=1024.0, double height=1024.0]) {
@@ -41,6 +47,8 @@ class SpriteBox extends RenderBox {
_systemWidth = width;
_systemHeight = height;
+ _transformMatrixIsDirty = true;
+
_scheduleTick();
}
@@ -60,6 +68,8 @@ class SpriteBox extends RenderBox {
void performLayout() {
size = constraints.constrain(Size.infinite);
+ _transformMatrixIsDirty = true;
+ _callSpriteBoxPerformedLayout(_rootNode);
}
// Event handling
@@ -69,8 +79,15 @@ class SpriteBox extends RenderBox {
// Rendering
- void paint(RenderObjectDisplayList canvas) {
- // Move to correct coordinate space before drawing
+ Matrix4 get transformMatrix {
+ // Get cached matrix if available
+ if (!_transformMatrixIsDirty && _transformMatrix != null) {
+ return _transformMatrix;
+ }
+
+ _transformMatrix = new Matrix4.identity();
+
+ // Calculate matrix
double scaleX = 1.0;
double scaleY = 1.0;
double offsetX = 0.0;
@@ -122,10 +139,17 @@ class SpriteBox extends RenderBox {
break;
}
+ _transformMatrix.translate(offsetX, offsetY);
+ _transformMatrix.scale(scaleX, scaleY);
+
+ return _transformMatrix;
+ }
+
+ void paint(RenderObjectDisplayList canvas) {
canvas.save();
- canvas.translate(offsetX, offsetY);
- canvas.scale(scaleX, scaleY);
+ // Move to correct coordinate space before drawing
+ canvas.concat(transformMatrix.storage);
// Draw the sprite tree
_rootNode.visit(canvas);
@@ -151,13 +175,31 @@ class SpriteBox extends RenderBox {
// Count the number of frames we've been running
_numFrames += 1;
+ _frameRate = 1.0/delta;
+
// Print frame rate
- if (_numFrames % 60 == 0) print("delta: ${delta} fps: ${1.0/delta}");
+ if (_numFrames % 60 == 0) print("delta: $delta fps: $_frameRate");
- _rootNode.update(delta);
+ _callUpdate(_rootNode, delta);
_scheduleTick();
}
+ void _callUpdate(Node node, double dt) {
+ node.update(dt);
+ for (Node child in node.children) {
+ if (!child.paused) {
+ _callUpdate(child, dt);
+ }
+ }
+ }
+
+ void _callSpriteBoxPerformedLayout(Node node) {
+ node.spriteBoxPerformedLayout();
+ for (Node child in node.children) {
+ _callSpriteBoxPerformedLayout(child);
+ }
+ }
+
// Hit tests
List<Node> findNodesAtPosition(Point position) {

Powered by Google App Engine
This is Rietveld 408576698