From 4a6919c3643ecba644a9761009373d8cd452c53c Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Tue, 25 Aug 2015 09:26:49 -0700 Subject: [PATCH 1/3] Adds virtual joystick to games library --- examples/game/lib/sprites.dart | 1 + examples/game/lib/virtual_joystick.dart | 62 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 examples/game/lib/virtual_joystick.dart diff --git a/examples/game/lib/sprites.dart b/examples/game/lib/sprites.dart index 7afdf904c65..9521be3e1db 100644 --- a/examples/game/lib/sprites.dart +++ b/examples/game/lib/sprites.dart @@ -39,3 +39,4 @@ part 'sprite_box.dart'; part 'sprite_widget.dart'; part 'texture.dart'; part 'util.dart'; +part 'virtual_joystick.dart'; diff --git a/examples/game/lib/virtual_joystick.dart b/examples/game/lib/virtual_joystick.dart new file mode 100644 index 00000000000..b4dabcf0001 --- /dev/null +++ b/examples/game/lib/virtual_joystick.dart @@ -0,0 +1,62 @@ +part of sprites; + +class VirtualJoystick extends NodeWithSize { + VirtualJoystick() : super(new Size(160.0, 160.0)) { + userInteractionEnabled = true; + handleMultiplePointers = false; + position = new Point(160.0, -20.0); + pivot = new Point(0.5, 1.0); + _center = new Point(size.width / 2.0, size.height / 2.0); + _handlePos = _center; + + _paintHandle = new Paint() + ..color=new Color(0xffffffff); + _paintControl = new Paint() + ..color=new Color(0xffffffff) + ..strokeWidth = 1.0 + ..setStyle(PaintingStyle.stroke); + } + + Point _value = Point.origin; + Point get value => _value; + + bool _isDown = false; + bool get isDown => _isDown; + + Point _pointerDownAt; + Point _center; + Point _handlePos; + + Paint _paintHandle; + Paint _paintControl; + + bool handleEvent(SpriteBoxEvent event) { + if (event.type == "pointerdown") { + _pointerDownAt = event.boxPosition; + actions.stopAll(); + _isDown = true; + } + else if (event.type == "pointerup" || event.type == "pointercancel") { + _pointerDownAt = null; + _value = Point.origin; + ActionTween moveToCenter = new ActionTween((a) => _handlePos = a, _handlePos, _center, 0.4, elasticOut); + actions.run(moveToCenter); + _isDown = false; + } else if (event.type == "pointermove") { + Offset movedDist = event.boxPosition - _pointerDownAt; + + _value = new Point( + (movedDist.dx / 80.0).clamp(-1.0, 1.0), + (movedDist.dy / 80.0).clamp(-1.0, 1.0)); + + _handlePos = _center + new Offset(_value.x * 40.0, _value.y * 40.0); + } + return true; + } + + void paint(PaintingCanvas canvas) { + applyTransformForPivot(canvas); + canvas.drawCircle(_handlePos, 25.0, _paintHandle); + canvas.drawCircle(_center, 40.0, _paintControl); + } +} From 0257b379759e1008d9e26fb10202a7e1ce965333 Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Tue, 25 Aug 2015 09:27:39 -0700 Subject: [PATCH 2/3] Adds base rotation property to rotate-to-movement constraint --- examples/game/lib/constraint.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/game/lib/constraint.dart b/examples/game/lib/constraint.dart index d1d3a82b245..9909ba84a5e 100644 --- a/examples/game/lib/constraint.dart +++ b/examples/game/lib/constraint.dart @@ -17,8 +17,9 @@ double _dampenRotation(double src, double dst, double dampening) { } class ConstraintRotationToMovement { - ConstraintRotationToMovement([this.dampening]); + ConstraintRotationToMovement([this.baseRotation = 0.0, this.dampening]); final double dampening; + final double baseRotation; Point _lastPosition; @@ -27,12 +28,12 @@ class ConstraintRotationToMovement { } void constrain(Node node, double dt) { - assert(_lastPosition != null); + if (_lastPosition == null) return; if (_lastPosition == node.position) return; // Get the target angle Offset offset = node.position - _lastPosition; - double target = degrees(GameMath.atan2(offset.dy, offset.dx)); + double target = degrees(GameMath.atan2(offset.dy, offset.dx)) + baseRotation; if (dampening == null) node.rotation = target; From cca7006d95299c1ea548edb87c275367812d0ee9 Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Tue, 25 Aug 2015 09:28:33 -0700 Subject: [PATCH 3/3] Removes custom joystick code and adds a new moving enemy to demo game --- examples/game/lib/game_demo.dart | 1 - examples/game/lib/game_demo_node.dart | 97 ++++++++++----------------- 2 files changed, 36 insertions(+), 62 deletions(-) diff --git a/examples/game/lib/game_demo.dart b/examples/game/lib/game_demo.dart index aaceee4396b..d5f0090164e 100644 --- a/examples/game/lib/game_demo.dart +++ b/examples/game/lib/game_demo.dart @@ -6,6 +6,5 @@ import 'sprites.dart'; import 'package:sky/rendering/object.dart'; import 'package:sky/widgets/framework.dart'; -import 'package:sky/animation/curves.dart'; part 'game_demo_node.dart'; diff --git a/examples/game/lib/game_demo_node.dart b/examples/game/lib/game_demo_node.dart index d6c420c0d57..c819ab58209 100644 --- a/examples/game/lib/game_demo_node.dart +++ b/examples/game/lib/game_demo_node.dart @@ -48,7 +48,7 @@ class GameDemoNode extends NodeWithSize { _hud = new Hud(_spritesUI); addChild(_hud); - + // Add initial game objects addObjects(); } @@ -195,6 +195,7 @@ class GameDemoNode extends NodeWithSize { yPos + _chunkSpacing * randomDouble()); _objectFactory.addGameObject(type, pos); } + _objectFactory.addGameObject(GameObjectType.movingEnemy, new Point(0.0, yPos + 160.0)); } void fire() { @@ -233,66 +234,6 @@ class GameDemoNode extends NodeWithSize { } } -class VirtualJoystick extends NodeWithSize { - VirtualJoystick() : super(new Size(160.0, 160.0)) { - userInteractionEnabled = true; - handleMultiplePointers = false; - position = new Point(160.0, -20.0); - pivot = new Point(0.5, 1.0); - _center = new Point(size.width / 2.0, size.height / 2.0); - _handlePos = _center; - - _paintHandle = new Paint() - ..color=new Color(0xffffffff); - _paintControl = new Paint() - ..color=new Color(0xffffffff) - ..strokeWidth = 1.0 - ..setStyle(sky.PaintingStyle.stroke); - } - - Point value = Point.origin; - - bool _isDown = false; - bool get isDown => _isDown; - - Point _pointerDownAt; - Point _center; - Point _handlePos; - - Paint _paintHandle; - Paint _paintControl; - - bool handleEvent(SpriteBoxEvent event) { - if (event.type == "pointerdown") { - _pointerDownAt = event.boxPosition; - actions.stopAll(); - _isDown = true; - } - else if (event.type == "pointerup" || event.type == "pointercancel") { - _pointerDownAt = null; - value = Point.origin; - ActionTween moveToCenter = new ActionTween((a) => _handlePos = a, _handlePos, _center, 0.4, elasticOut); - actions.run(moveToCenter); - _isDown = false; - } else if (event.type == "pointermove") { - Offset movedDist = event.boxPosition - _pointerDownAt; - - value = new Point( - (movedDist.dx / 80.0).clamp(-1.0, 1.0), - (movedDist.dy / 80.0).clamp(-1.0, 1.0)); - - _handlePos = _center + new Offset(value.x * 40.0, value.y * 40.0); - } - return true; - } - - void paint(PaintingCanvas canvas) { - applyTransformForPivot(canvas); - canvas.drawCircle(_handlePos, 25.0, _paintHandle); - canvas.drawCircle(_center, 40.0, _paintControl); - } -} - class Level extends Node { Level() { position = new Point(160.0, 0.0); @@ -482,9 +423,41 @@ class AsteroidSmall extends Asteroid { } } +class MovingEnemy extends Obstacle { + MovingEnemy(GameObjectFactory f) : super(f) { + _sprt = new Sprite(f.sheet["ship.png"]); + _sprt.scale = 0.2; + radius = 12.0; + maxDamage = 2.0; + addChild(_sprt); + + constraints = [new ConstraintRotationToMovement(0.0, 0.5)]; + } + + void setupActions() { + List offsets = [ + new Offset(-160.0, 160.0), + new Offset(-80.0, -160.0), + new Offset(0.0, 160.0), + new Offset(80.0, -160.0), + new Offset(160.0, 160.0)]; + + List points = []; + for (Offset offset in offsets) { + points.add(position + offset); + } + + ActionSpline spline = new ActionSpline((a) => position = a, points, 4.0); + actions.run(new ActionRepeatForever(spline)); + } + + Sprite _sprt; +} + enum GameObjectType { asteroidBig, asteroidSmall, + movingEnemy, } class GameObjectFactory { @@ -500,6 +473,8 @@ class GameObjectFactory { obj = new AsteroidBig(this); else if (type == GameObjectType.asteroidSmall) obj = new AsteroidSmall(this); + else if (type == GameObjectType.movingEnemy) + obj = new MovingEnemy(this); obj.position = pos; obj.setupActions();