Commit 3464bd18 authored by Viktor Lidholt's avatar Viktor Lidholt

Adds power ups to demo game, and some minor refactoring to support the addition

parent 51f3fdcb
...@@ -38,7 +38,11 @@ class GameDemoNode extends NodeWithSize { ...@@ -38,7 +38,11 @@ class GameDemoNode extends NodeWithSize {
_level = new Level(); _level = new Level();
_gameScreen.addChild(_level); _gameScreen.addChild(_level);
_objectFactory = new GameObjectFactory(_spritesGame, _sounds, _level); // Add heads up display
_playerState = new PlayerState(_spritesUI);
addChild(_playerState);
_objectFactory = new GameObjectFactory(_spritesGame, _sounds, _level, _playerState);
_level.ship = new Ship(_objectFactory); _level.ship = new Ship(_objectFactory);
_level.addChild(_level.ship); _level.addChild(_level.ship);
...@@ -47,10 +51,6 @@ class GameDemoNode extends NodeWithSize { ...@@ -47,10 +51,6 @@ class GameDemoNode extends NodeWithSize {
_joystick = new VirtualJoystick(); _joystick = new VirtualJoystick();
_gameScreen.addChild(_joystick); _gameScreen.addChild(_joystick);
// Add HUD
_hud = new Hud(_spritesUI);
addChild(_hud);
// Add initial game objects // Add initial game objects
addObjects(); addObjects();
} }
...@@ -76,7 +76,7 @@ class GameDemoNode extends NodeWithSize { ...@@ -76,7 +76,7 @@ class GameDemoNode extends NodeWithSize {
StarField _starField; StarField _starField;
RepeatedImage _background; RepeatedImage _background;
RepeatedImage _nebula; RepeatedImage _nebula;
Hud _hud; PlayerState _playerState;
// Game properties // Game properties
double _scrollSpeed = 2.0; double _scrollSpeed = 2.0;
...@@ -147,7 +147,7 @@ class GameDemoNode extends NodeWithSize { ...@@ -147,7 +147,7 @@ class GameDemoNode extends NodeWithSize {
for (GameObject damageable in damageables) { for (GameObject damageable in damageables) {
if (laser.collidingWith(damageable)) { if (laser.collidingWith(damageable)) {
// Hit something that can take damage // Hit something that can take damage
_hud.score += damageable.addDamage(laser.impact); damageable.addDamage(laser.impact);
laser.destroy(); laser.destroy();
} }
} }
...@@ -162,6 +162,11 @@ class GameDemoNode extends NodeWithSize { ...@@ -162,6 +162,11 @@ class GameDemoNode extends NodeWithSize {
killShip(); killShip();
_level.ship.visible = false; _level.ship.visible = false;
} }
} else if (node is GameObject && node.canBeCollected) {
if (node.collidingWith(_level.ship)) {
// The ship ran over something collectable
node.removeFromParent();
}
} }
} }
} }
...@@ -235,7 +240,7 @@ class GameDemoNode extends NodeWithSize { ...@@ -235,7 +240,7 @@ class GameDemoNode extends NodeWithSize {
_gameOver = true; _gameOver = true;
// Return to main scene and report the score back in 2 seconds // Return to main scene and report the score back in 2 seconds
new Timer(new Duration(seconds: 2), () { _gameOverCallback(_hud.score); }); new Timer(new Duration(seconds: 2), () { _gameOverCallback(_playerState.score); });
} }
} }
...@@ -256,14 +261,16 @@ enum GameObjectType { ...@@ -256,14 +261,16 @@ enum GameObjectType {
asteroidBig, asteroidBig,
asteroidSmall, asteroidSmall,
movingEnemy, movingEnemy,
coin,
} }
class GameObjectFactory { class GameObjectFactory {
GameObjectFactory(this.sheet, this.sounds, this.level); GameObjectFactory(this.sheet, this.sounds, this.level, this.playerState);
SpriteSheet sheet; SpriteSheet sheet;
Map<String,SoundEffect> sounds; Map<String,SoundEffect> sounds;
Level level; Level level;
PlayerState playerState;
void addAsteroids(int numAsteroids, double yPos, double distribution) { void addAsteroids(int numAsteroids, double yPos, double distribution) {
for (int i = 0; i < numAsteroids; i++) { for (int i = 0; i < numAsteroids; i++) {
...@@ -290,6 +297,8 @@ class GameObjectFactory { ...@@ -290,6 +297,8 @@ class GameObjectFactory {
obj = new AsteroidSmall(this); obj = new AsteroidSmall(this);
else if (type == GameObjectType.movingEnemy) else if (type == GameObjectType.movingEnemy)
obj = new MovingEnemy(this); obj = new MovingEnemy(this);
else if (type == GameObjectType.coin)
obj = new Coin(this);
obj.position = pos; obj.position = pos;
obj.setupActions(); obj.setupActions();
...@@ -298,7 +307,7 @@ class GameObjectFactory { ...@@ -298,7 +307,7 @@ class GameObjectFactory {
} }
} }
class Hud extends Node { class PlayerState extends Node {
SpriteSheet sheet; SpriteSheet sheet;
Sprite sprtBgScore; Sprite sprtBgScore;
...@@ -312,7 +321,7 @@ class Hud extends Node { ...@@ -312,7 +321,7 @@ class Hud extends Node {
_dirtyScore = true; _dirtyScore = true;
} }
Hud(this.sheet) { PlayerState(this.sheet) {
position = new Point(310.0, 10.0); position = new Point(310.0, 10.0);
scale = 0.6; scale = 0.6;
......
part of game; part of game;
abstract class GameObject extends Node { abstract class GameObject extends Node {
GameObject(this.f);
double radius = 0.0; double radius = 0.0;
double removeLimit = 1280.0; double removeLimit = 1280.0;
bool canDamageShip = true; bool canDamageShip = true;
bool canBeDamaged = true; bool canBeDamaged = true;
bool canBeCollected = false;
double maxDamage = 3.0; double maxDamage = 3.0;
double damage = 0.0; double damage = 0.0;
final GameObjectFactory f;
Paint _paintDebug = new Paint() Paint _paintDebug = new Paint()
..color=new Color(0xffff0000) ..color=new Color(0xffff0000)
..strokeWidth = 1.0 ..strokeWidth = 1.0
...@@ -37,25 +42,35 @@ abstract class GameObject extends Node { ...@@ -37,25 +42,35 @@ abstract class GameObject extends Node {
parent.addChild(explo); parent.addChild(explo);
} }
PowerUp powerUp = createPowerUp();
if (powerUp != null) {
powerUp.position = position;
powerUp.setupActions();
parent.addChild(powerUp);
}
removeFromParent(); removeFromParent();
} }
} }
int addDamage(double d) { void addDamage(double d) {
if (!canBeDamaged) return 0; if (!canBeDamaged) return;
damage += d; damage += d;
if (damage >= maxDamage) { if (damage >= maxDamage) {
destroy(); destroy();
return (maxDamage * 10).ceil(); f.playerState.score += (maxDamage * 10).ceil();
} }
return 10;
} }
Explosion createExplosion() { Explosion createExplosion() {
return null; return null;
} }
PowerUp createPowerUp() {
return null;
}
void paint(PaintingCanvas canvas) { void paint(PaintingCanvas canvas) {
if (_drawDebug) { if (_drawDebug) {
canvas.drawCircle(Point.origin, radius, _paintDebug); canvas.drawCircle(Point.origin, radius, _paintDebug);
...@@ -68,7 +83,7 @@ abstract class GameObject extends Node { ...@@ -68,7 +83,7 @@ abstract class GameObject extends Node {
} }
class Ship extends GameObject { class Ship extends GameObject {
Ship(GameObjectFactory f) { Ship(GameObjectFactory f) : super(f) {
// Add main ship sprite // Add main ship sprite
_sprt = new Sprite(f.sheet["ship.png"]); _sprt = new Sprite(f.sheet["ship.png"]);
_sprt.scale = 0.3; _sprt.scale = 0.3;
...@@ -99,7 +114,7 @@ class Ship extends GameObject { ...@@ -99,7 +114,7 @@ class Ship extends GameObject {
class Laser extends GameObject { class Laser extends GameObject {
double impact = 1.0; double impact = 1.0;
Laser(GameObjectFactory f) { Laser(GameObjectFactory f) : super(f) {
// Add sprite // Add sprite
_sprt = new Sprite(f.sheet["laser.png"]); _sprt = new Sprite(f.sheet["laser.png"]);
_sprt.scale = 0.3; _sprt.scale = 0.3;
...@@ -121,14 +136,13 @@ class Laser extends GameObject { ...@@ -121,14 +136,13 @@ class Laser extends GameObject {
abstract class Obstacle extends GameObject { abstract class Obstacle extends GameObject {
Obstacle(this._f); Obstacle(GameObjectFactory f) : super(f);
double explosionScale = 1.0; double explosionScale = 1.0;
GameObjectFactory _f;
Explosion createExplosion() { Explosion createExplosion() {
SoundEffectPlayer.sharedInstance().play(_f.sounds["explosion"]); SoundEffectPlayer.sharedInstance().play(f.sounds["explosion"]);
Explosion explo = new Explosion(_f.sheet); Explosion explo = new Explosion(f.sheet);
explo.scale = explosionScale; explo.scale = explosionScale;
return explo; return explo;
} }
...@@ -154,6 +168,10 @@ abstract class Asteroid extends Obstacle { ...@@ -154,6 +168,10 @@ abstract class Asteroid extends Obstacle {
int alpha = ((200.0 * d) ~/ maxDamage).clamp(0, 200); int alpha = ((200.0 * d) ~/ maxDamage).clamp(0, 200);
_sprt.colorOverlay = new Color.fromARGB(alpha, 255, 3, 86); _sprt.colorOverlay = new Color.fromARGB(alpha, 255, 3, 86);
} }
PowerUp createPowerUp() {
return new Coin(f);
}
} }
class AsteroidBig extends Asteroid { class AsteroidBig extends Asteroid {
...@@ -181,7 +199,7 @@ class MovingEnemy extends Obstacle { ...@@ -181,7 +199,7 @@ class MovingEnemy extends Obstacle {
_sprt = new Sprite(f.sheet["ship.png"]); _sprt = new Sprite(f.sheet["ship.png"]);
_sprt.scale = 0.2; _sprt.scale = 0.2;
radius = 12.0; radius = 12.0;
maxDamage = 2.0; maxDamage = 1.0;
addChild(_sprt); addChild(_sprt);
constraints = [new ConstraintRotationToMovement(dampening: 0.5)]; constraints = [new ConstraintRotationToMovement(dampening: 0.5)];
...@@ -231,3 +249,29 @@ class MovingEnemy extends Obstacle { ...@@ -231,3 +249,29 @@ class MovingEnemy extends Obstacle {
Sprite _sprt; Sprite _sprt;
} }
class PowerUp extends GameObject {
PowerUp(GameObjectFactory f) : super(f) {
canDamageShip = false;
canBeDamaged = false;
canBeCollected = true;
}
}
class Coin extends PowerUp {
Coin(GameObjectFactory f) : super(f) {
_sprt = new Sprite(f.sheet["shield.png"]);
_sprt.transferMode = sky.TransferMode.plus;
_sprt.size = new Size(15.0, 15.0);
addChild(_sprt);
radius = 7.5;
}
setupActions() {
ActionTween rotate = new ActionTween((a) => _sprt.rotation = a, 0.0, 360.0, 1.0);
actions.run(new ActionRepeatForever(rotate));
}
Sprite _sprt;
}
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