Merge branch 'master' of github.com:domokit/sky_engine
diff --git a/packages/flutter/example/game/lib/game_demo_world.dart b/packages/flutter/example/game/lib/game_demo_world.dart index db93d6f..e449ae4 100644 --- a/packages/flutter/example/game/lib/game_demo_world.dart +++ b/packages/flutter/example/game/lib/game_demo_world.dart
@@ -27,6 +27,7 @@ sky.Image _imgNebula; SpriteSheet _spriteSheet; + SpriteSheet _spriteSheetUI; Navigator _navigator; // Inputs @@ -46,8 +47,10 @@ int _numFrames = 0; bool _isGameOver = false; - GameDemoWorld(App app, this._navigator, ImageMap images, this._spriteSheet) : super(new Size(_gameSizeWidth, _gameSizeHeight)) { + // Heads up display + Hud _hud; + GameDemoWorld(App app, this._navigator, ImageMap images, this._spriteSheet, this._spriteSheetUI) : super(new Size(_gameSizeWidth, _gameSizeHeight)) { // Fetch images _imgNebula = images["assets/nebula.png"]; @@ -81,6 +84,10 @@ userInteractionEnabled = true; handleMultiplePointers = true; + + _hud = new Hud(_spriteSheetUI); + _hud.zPosition = 1000.0; + addChild(_hud); } // Methods for adding game objects @@ -585,6 +592,49 @@ } } +class Hud extends NodeWithSize { + SpriteSheet spriteSheetUI; + Sprite sprtBgScore; + Sprite sprtBgShield; + + int _score = 0; + + int get score => _score; + + set score(int score) { + _score = score; + _updateHud(); + } + + Hud(this.spriteSheetUI) { + pivot = Point.origin; + + sprtBgScore = new Sprite(spriteSheetUI["scoreboard.png"]); + sprtBgScore.pivot = Point.origin; + sprtBgScore.scale = 0.6; + addChild(sprtBgScore); + + sprtBgShield = new Sprite(spriteSheetUI["bar_shield.png"]); + sprtBgShield.pivot = new Point(1.0, 0.0); + sprtBgShield.scale = 0.6; + addChild(sprtBgShield); + } + + void spriteBoxPerformedLayout() { + // Set the size and position of HUD display + position = spriteBox.visibleArea.topLeft; + size = spriteBox.visibleArea.size; + + // Position hud objects + sprtBgScore.position = new Point(20.0, 20.0); + sprtBgShield.position = new Point(size.width - 20.0, 20.0); + } + + void _updateHud() { + + } +} + class Nebula extends Node { Nebula.withImage(sky.Image img) {
diff --git a/packages/flutter/example/game/lib/sprite_box.dart b/packages/flutter/example/game/lib/sprite_box.dart index c35d9e9..aa180c4 100644 --- a/packages/flutter/example/game/lib/sprite_box.dart +++ b/packages/flutter/example/game/lib/sprite_box.dart
@@ -39,6 +39,7 @@ // Add new references _addSpriteBoxReference(_rootNode); + markNeedsLayout(); } // Tracking of frame rate and updates @@ -55,7 +56,7 @@ _transformMode = value; // Invalidate stuff - if (attached) performLayout(); + markNeedsLayout(); } /// The transform mode used by the [SpriteBox]. @@ -68,7 +69,10 @@ Rect _visibleArea; - Rect get visibleArea => _visibleArea; + Rect get visibleArea { + if (_visibleArea == null) _calcTransformMatrix(); + return _visibleArea; + } // Setup @@ -150,6 +154,8 @@ } void handleEvent(Event event, _SpriteBoxHitTestEntry entry) { + if (!attached) return; + if (event is PointerEvent) { if (event.type == 'pointerdown') { @@ -212,10 +218,13 @@ /// 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 @@ 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(); }
diff --git a/packages/flutter/example/game/main.dart b/packages/flutter/example/game/main.dart index 8cd364d..dfd3294 100644 --- a/packages/flutter/example/game/main.dart +++ b/packages/flutter/example/game/main.dart
@@ -51,6 +51,7 @@ class GameDemoApp extends App { NavigationState _navigationState; + GameDemoWorld _game; void initState() { _navigationState = new NavigationState([ @@ -84,16 +85,18 @@ } Widget _buildGameScene(navigator, route) { - return new SpriteWidget( - new GameDemoWorld(_app, navigator, _loader, _spriteSheet) - ); + if (_game == null) _game = new GameDemoWorld(_app, navigator, _loader, _spriteSheet); + return new SpriteWidget(_game); } Widget _buildMainScene(navigator, route) { return new Center( child: new RaisedButton( child: new Text("Play"), - onPressed: () => navigator.pushNamed('/game') + onPressed: () { + _game = new GameDemoWorld(_app, navigator, _loader, _spriteSheet, _spriteSheetUI); + navigator.pushNamed('/game'); + } ) ); }