diff --git a/examples/game/lib/game_demo.dart b/examples/game/lib/game_demo.dart index 5a9b20d0f90694b43eede26be6cfe37af049fdb6..b54ec2877b953afc20d48ad892326526b5d8ee8c 100644 --- a/examples/game/lib/game_demo.dart +++ b/examples/game/lib/game_demo.dart @@ -5,7 +5,5 @@ import 'dart:math' as Math; import 'package:vector_math/vector_math_64.dart'; import 'sprites.dart'; import 'package:box2d/box2d.dart'; -import 'package:sky/rendering/box.dart'; part 'game_demo_world.dart'; -part 'game_demo_box.dart'; diff --git a/examples/game/lib/game_demo_box.dart b/examples/game/lib/game_demo_box.dart deleted file mode 100644 index 2b9f0c4d325651b3ec27e0231ee9bc46418af3e0..0000000000000000000000000000000000000000 --- a/examples/game/lib/game_demo_box.dart +++ /dev/null @@ -1,79 +0,0 @@ -part of game; - -const double _steeringThreshold = 0.0; -const double _steeringMax = 150.0; - -class GameDemoBox extends SpriteBox { - - GameDemoBox(GameDemoWorld game) : super(game, SpriteBoxTransformMode.letterbox); - - GameDemoWorld get _gameWorld => this.rootNode; - - // Handle pointers - int _firstPointer = -1; - int _secondPointer = -1; - Point _firstPointerDownPos; - -// void handleEvent(Event event, BoxHitTestEntry entry) { -// if (event is PointerEvent) { -// Point pointerPos = new Point(event.x, event.y); -// int pointer = event.pointer; -// -// switch (event.type) { -// case 'pointerdown': -// if (_firstPointer == -1) { -// // Assign the first pointer -// _firstPointer = pointer; -// _firstPointerDownPos = pointerPos; -// } -// else if (_secondPointer == -1) { -// // Assign second pointer -// _secondPointer = pointer; -// _gameWorld.controlFire(); -// } -// else { -// // There is a pointer used for steering, let's fire instead -// _gameWorld.controlFire(); -// } -// break; -// case 'pointermove': -// if (pointer == _firstPointer) { -// // Handle turning control -// double joystickX = 0.0; -// double deltaX = pointerPos.x - _firstPointerDownPos.x; -// if (deltaX > _steeringThreshold || deltaX < -_steeringThreshold) { -// joystickX = (deltaX - _steeringThreshold)/(_steeringMax - _steeringThreshold); -// if (joystickX > 1.0) joystickX = 1.0; -// if (joystickX < -1.0) joystickX = -1.0; -// } -// -// double joystickY = 0.0; -// double deltaY = pointerPos.y - _firstPointerDownPos.y; -// if (deltaY > _steeringThreshold || deltaY < -_steeringThreshold) { -// joystickY = (deltaY - _steeringThreshold)/(_steeringMax - _steeringThreshold); -// if (joystickY > 1.0) joystickY = 1.0; -// if (joystickY < -1.0) joystickY = -1.0; -// } -// -// _gameWorld.controlSteering(joystickX, joystickY); -// } -// break; -// case 'pointerup': -// case 'pointercancel': -// if (pointer == _firstPointer) { -// // Un-assign the first pointer -// _firstPointer = -1; -// _firstPointerDownPos = null; -// _gameWorld.controlSteering(0.0, 0.0); -// } -// else if (pointer == _secondPointer) { -// _secondPointer = -1; -// } -// break; -// default: -// break; -// } -// } -// } - -} diff --git a/examples/game/lib/game_demo_world.dart b/examples/game/lib/game_demo_world.dart index 82094d5b2b4fdb441863c84d8adfce5a91c33616..ce57d7084ef5dc2d7d8d1e1bd9903e6adb257c17 100644 --- a/examples/game/lib/game_demo_world.dart +++ b/examples/game/lib/game_demo_world.dart @@ -1,5 +1,8 @@ part of game; +const double _steeringThreshold = 0.0; +const double _steeringMax = 150.0; + // Random generator Math.Random _rand = new Math.Random(); @@ -357,7 +360,7 @@ class Laser extends Sprite { _movementVector = new Point(_movementVector.x + ship._movementVector[0], _movementVector.y + ship._movementVector[1]); } - bool move() { + void move() { position = pointAdd(position, _movementVector); _frameCount++; } diff --git a/examples/game/lib/sprite_box.dart b/examples/game/lib/sprite_box.dart index 1fb0b0806eba04ca593d8731caff2134abbacd8b..9125b44f4fb10684ce20e444a15d9149f594a978 100644 --- a/examples/game/lib/sprite_box.dart +++ b/examples/game/lib/sprite_box.dart @@ -14,7 +14,7 @@ class SpriteBox extends RenderBox { // Member variables // Root node for drawing - Node _rootNode; + NodeWithSize _rootNode; // Tracking of frame rate and updates double _lastTimeStamp; @@ -23,8 +23,8 @@ class SpriteBox extends RenderBox { // Transformation mode SpriteBoxTransformMode transformMode; - double _systemWidth; - double _systemHeight; +// double _systemWidth; +// double _systemHeight; // Cached transformation matrix Matrix4 _transformMatrix; @@ -33,7 +33,7 @@ class SpriteBox extends RenderBox { // Setup - SpriteBox(Node rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode.nativePoints, double width=1024.0, double height=1024.0]) { + SpriteBox(NodeWithSize rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode.nativePoints]) { assert(rootNode != null); assert(rootNode._spriteBox == null); @@ -45,8 +45,8 @@ class SpriteBox extends RenderBox { // Setup transform mode transformMode = mode; - _systemWidth = width; - _systemHeight = height; +// _systemWidth = rootNode.size.width; +// _systemHeight = rootNode.size.height; _scheduleTick(); } @@ -60,10 +60,10 @@ class SpriteBox extends RenderBox { // Properties - double get systemWidth => _systemWidth; - double get systemHeight => _systemHeight; + double get systemWidth => rootNode.size.width; + double get systemHeight => rootNode.size.height; - Node get rootNode => _rootNode; + NodeWithSize get rootNode => _rootNode; void performLayout() { size = constraints.constrain(Size.infinite); @@ -152,44 +152,49 @@ class SpriteBox extends RenderBox { double offsetX = 0.0; double offsetY = 0.0; + double systemWidth = rootNode.size.width; + double systemHeight = rootNode.size.height; + switch(transformMode) { case SpriteBoxTransformMode.stretch: - scaleX = size.width/_systemWidth; - scaleY = size.height/_systemHeight; + scaleX = size.width/systemWidth; + scaleY = size.height/systemHeight; break; case SpriteBoxTransformMode.letterbox: - scaleX = size.width/_systemWidth; - scaleY = size.height/_systemHeight; + scaleX = size.width/systemWidth; + scaleY = size.height/systemHeight; if (scaleX > scaleY) { scaleY = scaleX; - offsetY = (size.height - scaleY * _systemHeight)/2.0; + offsetY = (size.height - scaleY * systemHeight)/2.0; } else { scaleX = scaleY; - offsetX = (size.width - scaleX * _systemWidth)/2.0; + offsetX = (size.width - scaleX * systemWidth)/2.0; } break; case SpriteBoxTransformMode.scaleToFit: - scaleX = size.width/_systemWidth; - scaleY = size.height/_systemHeight; + scaleX = size.width/systemWidth; + scaleY = size.height/systemHeight; if (scaleX < scaleY) { scaleY = scaleX; - offsetY = (size.height - scaleY * _systemHeight)/2.0; + offsetY = (size.height - scaleY * systemHeight)/2.0; } else { scaleX = scaleY; - offsetX = (size.width - scaleX * _systemWidth)/2.0; + offsetX = (size.width - scaleX * systemWidth)/2.0; } break; case SpriteBoxTransformMode.fixedWidth: - scaleX = size.width/_systemWidth; + scaleX = size.width/systemWidth; scaleY = scaleX; - _systemHeight = size.height/scaleX; + systemHeight = size.height/scaleX; + rootNode.size = new Size(systemWidth, systemHeight); break; case SpriteBoxTransformMode.fixedHeight: - scaleY = size.height/_systemHeight; + scaleY = size.height/systemHeight; scaleX = scaleY; - _systemWidth = size.width/scaleY; + systemWidth = size.width/scaleY; + rootNode.size = new Size(systemWidth, systemHeight); break; case SpriteBoxTransformMode.nativePoints: break; diff --git a/examples/game/lib/sprite_widget.dart b/examples/game/lib/sprite_widget.dart new file mode 100644 index 0000000000000000000000000000000000000000..11a06a3670afc97d21083cd6fd0b01d1370fbc74 --- /dev/null +++ b/examples/game/lib/sprite_widget.dart @@ -0,0 +1,21 @@ +part of sprites; + +class SpriteWidget extends OneChildRenderObjectWrapper { + + final NodeWithSize rootNode; + final SpriteBoxTransformMode transformMode; + + SpriteWidget(this.rootNode, [this.transformMode = SpriteBoxTransformMode.letterbox]); + + SpriteBox get root => super.root; + + SpriteBox createNode() => new SpriteBox(rootNode, transformMode); + + void syncRenderObject(SpriteWidget old) { + super.syncRenderObject(old); + + // SpriteBox doesn't allow mutation of these properties + assert(rootNode == root.rootNode); + assert(transformMode == root.transformMode); + } +} \ No newline at end of file diff --git a/examples/game/lib/sprites.dart b/examples/game/lib/sprites.dart index c46f89a52bb4578364f35cfaddb2f42f2c54a7c6..3f31231d5c04b8159a2abf447569602df8502ab2 100644 --- a/examples/game/lib/sprites.dart +++ b/examples/game/lib/sprites.dart @@ -8,9 +8,11 @@ import 'package:sky/base/scheduler.dart' as scheduler; import 'package:sky/mojo/net/image_cache.dart' as image_cache; import 'package:sky/rendering/box.dart'; import 'package:sky/rendering/object.dart'; +import 'package:sky/widgets/widget.dart'; import 'package:vector_math/vector_math.dart'; part 'sprite_box.dart'; +part 'sprite_widget.dart'; part 'node.dart'; part 'node_with_size.dart'; part 'sprite.dart'; diff --git a/examples/game/main.dart b/examples/game/main.dart index 8e971fc1cd2769f5d6c006f251486c15f27d9904..2ba270120c13b43211f3fa8917e6fd0580e78336 100644 --- a/examples/game/main.dart +++ b/examples/game/main.dart @@ -29,7 +29,7 @@ class GameDemoApp extends App { Widget build() { return new Stack([ - new GameDemo(), + new SpriteWidget(new GameDemoWorld(_loader)), // new StackPositionedChild( // new Flex([ // new FlexExpandingChild( @@ -49,12 +49,3 @@ class GameDemoApp extends App { } ImageMap _loader; - -class GameDemo extends OneChildRenderObjectWrapper { - - GameDemo({ Widget child, Object key }) - : super(child: child, key: key); - - GameDemoBox get root { return super.root; } - GameDemoBox createNode() => new GameDemoBox(new GameDemoWorld(_loader)); -}