Commit 34e0ef83 authored by Viktor Lidholt's avatar Viktor Lidholt

Merge pull request #795 from vlidholt/master

Additions to demo game
parents f8cad61b af6372fd
......@@ -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;
......
......@@ -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';
......@@ -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<Offset> 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<Point> 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();
......
......@@ -39,3 +39,4 @@ part 'sprite_box.dart';
part 'sprite_widget.dart';
part 'texture.dart';
part 'util.dart';
part 'virtual_joystick.dart';
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);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment