Commit 138e8fbf authored by Viktor Lidholt's avatar Viktor Lidholt

Adds power-ups to demo game

parent c7d2872d
...@@ -45,6 +45,7 @@ class GameDemoNode extends NodeWithSize { ...@@ -45,6 +45,7 @@ class GameDemoNode extends NodeWithSize {
_objectFactory = new GameObjectFactory(_spritesGame, _sounds, _level, _playerState); _objectFactory = new GameObjectFactory(_spritesGame, _sounds, _level, _playerState);
_level.ship = new Ship(_objectFactory); _level.ship = new Ship(_objectFactory);
_level.ship.setupActions();
_level.addChild(_level.ship); _level.addChild(_level.ship);
// Add the joystick // Add the joystick
...@@ -111,7 +112,7 @@ class GameDemoNode extends NodeWithSize { ...@@ -111,7 +112,7 @@ class GameDemoNode extends NodeWithSize {
// Add shots // Add shots
if (_framesToFire == 0 && _joystick.isDown && !_gameOver) { if (_framesToFire == 0 && _joystick.isDown && !_gameOver) {
fire(); fire();
_framesToFire = _framesBetweenShots; _framesToFire = (_playerState.speedLaserActive) ? _framesBetweenShots ~/ 2 : _framesBetweenShots;
} }
if (_framesToFire > 0) _framesToFire--; if (_framesToFire > 0) _framesToFire--;
...@@ -158,9 +159,13 @@ class GameDemoNode extends NodeWithSize { ...@@ -158,9 +159,13 @@ class GameDemoNode extends NodeWithSize {
for (Node node in nodes) { for (Node node in nodes) {
if (node is GameObject && node.canDamageShip) { if (node is GameObject && node.canDamageShip) {
if (node.collidingWith(_level.ship)) { if (node.collidingWith(_level.ship)) {
// The ship was hit :( if (_playerState.shieldActive) {
killShip(); // Hit, but saved by the shield!
_level.ship.visible = false; node.destroy();
} else {
// The ship was hit :(
killShip();
}
} }
} else if (node is GameObject && node.canBeCollected) { } else if (node is GameObject && node.canBeCollected) {
if (node.collidingWith(_level.ship)) { if (node.collidingWith(_level.ship)) {
...@@ -209,14 +214,24 @@ class GameDemoNode extends NodeWithSize { ...@@ -209,14 +214,24 @@ class GameDemoNode extends NodeWithSize {
} }
void fire() { void fire() {
Laser shot0 = new Laser(_objectFactory); Laser shot0 = new Laser(_objectFactory, -90.0);
shot0.position = _level.ship.position + new Offset(17.0, -10.0); shot0.position = _level.ship.position + new Offset(17.0, -10.0);
_level.addChild(shot0); _level.addChild(shot0);
Laser shot1 = new Laser(_objectFactory); Laser shot1 = new Laser(_objectFactory, -90.0);
shot1.position = _level.ship.position + new Offset(-17.0, -10.0); shot1.position = _level.ship.position + new Offset(-17.0, -10.0);
_level.addChild(shot1); _level.addChild(shot1);
if (_playerState.sideLaserActive) {
Laser shot2 = new Laser(_objectFactory, 0.0);
shot2.position = _level.ship.position + new Offset(17.0, -10.0);
_level.addChild(shot2);
Laser shot3 = new Laser(_objectFactory, 180.0);
shot3.position = _level.ship.position + new Offset(-17.0, -10.0);
_level.addChild(shot3);
}
_effectPlayer.play(_sounds["laser"]); _effectPlayer.play(_sounds["laser"]);
} }
......
...@@ -3,6 +3,7 @@ part of game; ...@@ -3,6 +3,7 @@ part of game;
enum GameObjectType { enum GameObjectType {
asteroidBig, asteroidBig,
asteroidSmall, asteroidSmall,
asteroidPowerUp,
enemyScout, enemyScout,
enemyDestroyer, enemyDestroyer,
coin, coin,
...@@ -19,6 +20,7 @@ class GameObjectFactory { ...@@ -19,6 +20,7 @@ class GameObjectFactory {
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++) {
GameObjectType type = (randomDouble() < distribution) ? GameObjectType.asteroidBig : GameObjectType.asteroidSmall; GameObjectType type = (randomDouble() < distribution) ? GameObjectType.asteroidBig : GameObjectType.asteroidSmall;
if (i == 0) type = GameObjectType.asteroidPowerUp;
Point pos = new Point(randomSignedDouble() * 160.0, Point pos = new Point(randomSignedDouble() * 160.0,
yPos + _chunkSpacing * randomDouble()); yPos + _chunkSpacing * randomDouble());
addGameObject(type, pos); addGameObject(type, pos);
...@@ -45,6 +47,8 @@ class GameObjectFactory { ...@@ -45,6 +47,8 @@ class GameObjectFactory {
obj = new AsteroidBig(this); obj = new AsteroidBig(this);
else if (type == GameObjectType.asteroidSmall) else if (type == GameObjectType.asteroidSmall)
obj = new AsteroidSmall(this); obj = new AsteroidSmall(this);
else if (type == GameObjectType.asteroidPowerUp)
obj = new AsteroidPowerUp(this);
else if (type == GameObjectType.enemyScout) else if (type == GameObjectType.enemyScout)
obj = new EnemyScout(this); obj = new EnemyScout(this);
else if (type == GameObjectType.enemyDestroyer) else if (type == GameObjectType.enemyDestroyer)
......
...@@ -42,7 +42,7 @@ abstract class GameObject extends Node { ...@@ -42,7 +42,7 @@ abstract class GameObject extends Node {
parent.addChild(explo); parent.addChild(explo);
} }
PowerUp powerUp = createPowerUp(); Collectable powerUp = createPowerUp();
if (powerUp != null) { if (powerUp != null) {
powerUp.position = position; powerUp.position = position;
powerUp.setupActions(); powerUp.setupActions();
...@@ -71,7 +71,7 @@ abstract class GameObject extends Node { ...@@ -71,7 +71,7 @@ abstract class GameObject extends Node {
return null; return null;
} }
PowerUp createPowerUp() { Collectable createPowerUp() {
return null; return null;
} }
...@@ -93,8 +93,13 @@ class Ship extends GameObject { ...@@ -93,8 +93,13 @@ class Ship extends GameObject {
_sprt.scale = 0.3; _sprt.scale = 0.3;
_sprt.rotation = -90.0; _sprt.rotation = -90.0;
addChild(_sprt); addChild(_sprt);
radius = 20.0;
_sprtShield = new Sprite(f.sheet["shield.png"]);
_sprtShield.scale = 0.35;
_sprtShield.transferMode = sky.TransferMode.plus;
addChild(_sprtShield);
radius = 20.0;
canBeDamaged = false; canBeDamaged = false;
canDamageShip = false; canDamageShip = false;
...@@ -103,6 +108,7 @@ class Ship extends GameObject { ...@@ -103,6 +108,7 @@ class Ship extends GameObject {
} }
Sprite _sprt; Sprite _sprt;
Sprite _sprtShield;
void applyThrust(Point joystickValue, double scroll) { void applyThrust(Point joystickValue, double scroll) {
Point oldPos = position; Point oldPos = position;
...@@ -113,29 +119,51 @@ class Ship extends GameObject { ...@@ -113,29 +119,51 @@ class Ship extends GameObject {
GameMath.filter(oldPos.x, target.x, filterFactor), GameMath.filter(oldPos.x, target.x, filterFactor),
GameMath.filter(oldPos.y, target.y, filterFactor)); GameMath.filter(oldPos.y, target.y, filterFactor));
} }
void setupActions() {
ActionTween rotate = new ActionTween((a) => _sprtShield.rotation = a, 0.0, 360.0, 1.0);
_sprtShield.actions.run(new ActionRepeatForever(rotate));
}
void update(double dt) {
// Update shield
if (f.playerState.shieldActive) {
if (f.playerState.shieldDeactivating)
_sprtShield.visible = !_sprtShield.visible;
else
_sprtShield.visible = true;
} else {
_sprtShield.visible = false;
}
}
} }
class Laser extends GameObject { class Laser extends GameObject {
double impact = 1.0; double impact = 1.0;
Laser(GameObjectFactory f) : super(f) { Laser(GameObjectFactory f, double r) : super(f) {
// Add sprite // Add sprite
_sprt = new Sprite(f.sheet["explosion_particle.png"]); _sprt = new Sprite(f.sheet["explosion_particle.png"]);
_sprt.scale = 0.5; _sprt.scale = 0.5;
_sprt.colorOverlay = new Color(0xff95f4fb); _sprt.colorOverlay = new Color(0xff95f4fb);
_sprt.transferMode = sky.TransferMode.plus; _sprt.transferMode = sky.TransferMode.plus;
_sprt.rotation = r + 90.0;
addChild(_sprt); addChild(_sprt);
radius = 10.0; radius = 10.0;
removeLimit = 640.0; removeLimit = 640.0;
canDamageShip = false; canDamageShip = false;
canBeDamaged = false; canBeDamaged = false;
_offset = new Offset(math.cos(radians(r)) * 10.0, math.sin(radians(r)) * 10.0);
} }
Sprite _sprt; Sprite _sprt;
Offset _offset;
void move() { void move() {
position += new Offset(0.0, -10.0); position += _offset;
} }
} }
...@@ -178,7 +206,7 @@ abstract class Asteroid extends Obstacle { ...@@ -178,7 +206,7 @@ abstract class Asteroid extends Obstacle {
_sprt.colorOverlay = colorForDamage(d, maxDamage); _sprt.colorOverlay = colorForDamage(d, maxDamage);
} }
PowerUp createPowerUp() { Collectable createPowerUp() {
return new Coin(f); return new Coin(f);
} }
} }
...@@ -203,6 +231,14 @@ class AsteroidSmall extends Asteroid { ...@@ -203,6 +231,14 @@ class AsteroidSmall extends Asteroid {
} }
} }
class AsteroidPowerUp extends AsteroidBig {
AsteroidPowerUp(GameObjectFactory f) : super(f);
Collectable createPowerUp() {
return new PowerUp(f, nextPowerUpType());
}
}
class EnemyScout extends Obstacle { class EnemyScout extends Obstacle {
EnemyScout(GameObjectFactory f) : super(f) { EnemyScout(GameObjectFactory f) : super(f) {
_sprt = new Sprite(f.sheet["enemy_scout_0.png"]); _sprt = new Sprite(f.sheet["enemy_scout_0.png"]);
...@@ -256,7 +292,7 @@ class EnemyScout extends Obstacle { ...@@ -256,7 +292,7 @@ class EnemyScout extends Obstacle {
actions.run(new ActionRepeatForever(spline)); actions.run(new ActionRepeatForever(spline));
} }
PowerUp createPowerUp() { Collectable createPowerUp() {
return new Coin(f); return new Coin(f);
} }
...@@ -286,7 +322,7 @@ class EnemyDestroyer extends Obstacle { ...@@ -286,7 +322,7 @@ class EnemyDestroyer extends Obstacle {
actions.run(new ActionRepeatForever(circle)); actions.run(new ActionRepeatForever(circle));
} }
PowerUp createPowerUp() { Collectable createPowerUp() {
return new Coin(f); return new Coin(f);
} }
...@@ -337,15 +373,17 @@ class EnemyLaser extends Obstacle { ...@@ -337,15 +373,17 @@ class EnemyLaser extends Obstacle {
} }
} }
class PowerUp extends GameObject { class Collectable extends GameObject {
PowerUp(GameObjectFactory f) : super(f) { Collectable(GameObjectFactory f) : super(f) {
canDamageShip = false; canDamageShip = false;
canBeDamaged = false; canBeDamaged = false;
canBeCollected = true; canBeCollected = true;
zPosition = 20.0;
} }
} }
class Coin extends PowerUp { class Coin extends Collectable {
Coin(GameObjectFactory f) : super(f) { Coin(GameObjectFactory f) : super(f) {
_sprt = new Sprite(f.sheet["coin.png"]); _sprt = new Sprite(f.sheet["coin.png"]);
_sprt.scale = 0.7; _sprt.scale = 0.7;
...@@ -354,9 +392,14 @@ class Coin extends PowerUp { ...@@ -354,9 +392,14 @@ class Coin extends PowerUp {
radius = 7.5; radius = 7.5;
} }
setupActions() { void setupActions() {
// Rotate
ActionTween rotate = new ActionTween((a) => _sprt.rotation = a, 0.0, 360.0, 1.0); ActionTween rotate = new ActionTween((a) => _sprt.rotation = a, 0.0, 360.0, 1.0);
actions.run(new ActionRepeatForever(rotate)); actions.run(new ActionRepeatForever(rotate));
// Fade in
ActionTween fadeIn = new ActionTween((a) => _sprt.opacity = a, 0.0, 1.0, 0.6);
actions.run(fadeIn);
} }
Sprite _sprt; Sprite _sprt;
...@@ -366,3 +409,51 @@ class Coin extends PowerUp { ...@@ -366,3 +409,51 @@ class Coin extends PowerUp {
super.collect(); super.collect();
} }
} }
enum PowerUpType {
shield,
speedLaser,
sideLaser,
}
List<PowerUpType> _powerUpTypes = new List.from(PowerUpType.values);
int _lastPowerUp = _powerUpTypes.length;
PowerUpType nextPowerUpType() {
if (_lastPowerUp >= _powerUpTypes.length) {
_powerUpTypes.shuffle();
_lastPowerUp = 0;
}
PowerUpType type = _powerUpTypes[_lastPowerUp];
_lastPowerUp++;
return type;
}
class PowerUp extends Collectable {
PowerUp(GameObjectFactory f, this.type) : super(f) {
_sprt = new Sprite(f.sheet["coin.png"]);
_sprt.scale = 1.2;
addChild(_sprt);
radius = 10.0;
}
Sprite _sprt;
PowerUpType type;
void setupActions() {
ActionTween rotate = new ActionTween((a) => _sprt.rotation = a, 0.0, 360.0, 1.0);
actions.run(new ActionRepeatForever(rotate));
// Fade in
ActionTween fadeIn = new ActionTween((a) => _sprt.opacity = a, 0.0, 1.0, 0.6);
actions.run(fadeIn);
}
void collect() {
f.playerState.activatePowerUp(type);
super.collect();
}
}
...@@ -71,6 +71,26 @@ class PlayerState extends Node { ...@@ -71,6 +71,26 @@ class PlayerState extends Node {
addChild(sprt); addChild(sprt);
} }
void activatePowerUp(PowerUpType type) {
if (type == PowerUpType.shield) {
_shieldFrames += 300;
} else if (type == PowerUpType.sideLaser) {
_sideLaserFrames += 300;
} else if (type == PowerUpType.speedLaser) {
_speedLaserFrames += 300;
}
}
int _shieldFrames = 0;
bool get shieldActive => _shieldFrames > 0;
bool get shieldDeactivating => _shieldFrames > 0 && _shieldFrames < 60;
int _sideLaserFrames = 0;
bool get sideLaserActive => _sideLaserFrames > 0;
int _speedLaserFrames = 0;
bool get speedLaserActive => _speedLaserFrames > 0;
void flashBgSprite(Sprite sprt) { void flashBgSprite(Sprite sprt) {
sprt.actions.stopAll(); sprt.actions.stopAll();
ActionTween flash = new ActionTween( ActionTween flash = new ActionTween(
...@@ -80,6 +100,12 @@ class PlayerState extends Node { ...@@ -80,6 +100,12 @@ class PlayerState extends Node {
0.3); 0.3);
sprt.actions.run(flash); sprt.actions.run(flash);
} }
void update(double dt) {
if (_shieldFrames > 0) _shieldFrames--;
if (_sideLaserFrames > 0) _sideLaserFrames--;
if (_speedLaserFrames > 0) _speedLaserFrames--;
}
} }
class ScoreDisplay extends Node { class ScoreDisplay extends Node {
......
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