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