Adds scoring and level up in game demo

This commit is contained in:
Viktor Lidholt 2015-07-22 10:37:28 -07:00
parent bb0c8bb13e
commit 34e1268f1f

View file

@ -46,6 +46,7 @@ class GameDemoWorld extends NodeWithSize {
// Game state
int _numFrames = 0;
bool _isGameOver = false;
int _currentLevel = 0;
// Heads up display
Hud _hud;
@ -56,15 +57,6 @@ class GameDemoWorld extends NodeWithSize {
_gameLayer = new Node();
this.addChild(_gameLayer);
// Add some asteroids to the game world
for (int i = 0; i < 5; i++) {
addAsteroid(AsteroidSize.large);
}
for (int i = 0; i < 5; i++) {
addAsteroid(AsteroidSize.medium);
}
// Add ship
addShip();
@ -88,6 +80,25 @@ class GameDemoWorld extends NodeWithSize {
_hud = new Hud(_spriteSheetUI);
_hud.zPosition = 1000.0;
addChild(_hud);
// Setup level
setupLevel(0);
}
void setupLevel(int level) {
int numLargeAsteroids = 5 + level * 2;
int numMediumAsteroids = 5 + level * 2;
// Add some asteroids to the game world
for (int i = 0; i < numLargeAsteroids; i++) {
addAsteroid(AsteroidSize.large);
}
for (int i = 0; i < numMediumAsteroids; i++) {
addAsteroid(AsteroidSize.medium);
}
_numFrames = 0;
_shield.visible = true;
}
// Methods for adding game objects
@ -98,6 +109,10 @@ class GameDemoWorld extends NodeWithSize {
if (pos != null) asteroid.position = pos;
_gameLayer.addChild(asteroid);
_asteroids.add(asteroid);
// Animate asteroid into the scene
Action action = new ActionTween((a) => asteroid.scale = a, 0.0, 1.0, 1.0, bounceOut);
_gameLayer.actions.run(action);
}
void addShip() {
@ -262,6 +277,14 @@ class GameDemoWorld extends NodeWithSize {
// Remove asteroid
asteroid.removeFromParent();
_asteroids.removeAt(j);
// Scoring
if (asteroid._asteroidSize == AsteroidSize.large)
addScore(100);
else if (asteroid._asteroidSize == AsteroidSize.medium)
addScore(50);
else
addScore(10);
break;
}
}
@ -285,6 +308,12 @@ class GameDemoWorld extends NodeWithSize {
centerCamera();
warpObjects();
// Check for level up
if (_asteroids.length == 0) {
_currentLevel++;
setupLevel(_currentLevel);
}
// Update shield
if (_numFrames > _numFramesShieldActive) _shield.visible = false;
else if (_numFrames > _numFramesShieldActive - _numFramesShieldFlickers) _shield.visible = !_shield.visible;
@ -415,6 +444,11 @@ class GameDemoWorld extends NodeWithSize {
}
return true;
}
// Scoring and HUD
void addScore(int score) {
_hud.score += score;
}
}
// Game objects
@ -596,6 +630,7 @@ class Hud extends NodeWithSize {
SpriteSheet spriteSheetUI;
Sprite sprtBgScore;
Sprite sprtBgShield;
bool _dirtyScore = true;
int _score = 0;
@ -603,21 +638,22 @@ class Hud extends NodeWithSize {
set score(int score) {
_score = score;
_updateHud();
_dirtyScore = true;
}
Hud(this.spriteSheetUI) {
pivot = Point.origin;
sprtBgScore = new Sprite(spriteSheetUI["scoreboard.png"]);
sprtBgScore.pivot = Point.origin;
sprtBgScore.pivot = new Point(1.0, 0.0);
sprtBgScore.scale = 0.6;
addChild(sprtBgScore);
sprtBgShield = new Sprite(spriteSheetUI["bar_shield.png"]);
sprtBgShield.pivot = new Point(1.0, 0.0);
sprtBgShield.pivot = Point.origin;
sprtBgShield.scale = 0.6;
addChild(sprtBgShield);
// TODO: Add shield
//addChild(sprtBgShield);
}
void spriteBoxPerformedLayout() {
@ -626,15 +662,28 @@ class Hud extends NodeWithSize {
size = spriteBox.visibleArea.size;
// Position hud objects
sprtBgScore.position = new Point(20.0, 20.0);
sprtBgShield.position = new Point(size.width - 20.0, 20.0);
sprtBgShield.position = new Point(20.0, 20.0);
sprtBgScore.position = new Point(size.width - 20.0, 20.0);
}
void _updateHud() {
sprtBgScore.removeAllChildren();
void update(double dt) {
// Update score
if (_dirtyScore) {
String scoreStr = _score.toString();
sprtBgScore.removeAllChildren();
String scoreStr = _score.toString();
double xPos = -50.0;
for (int i = scoreStr.length - 1; i >= 0; i--) {
String numStr = scoreStr.substring(i, i + 1);
Sprite numSprt = new Sprite(spriteSheetUI["number_$numStr.png"]);
numSprt.position = new Point(xPos, 49.0);
sprtBgScore.addChild(numSprt);
xPos -= 37.0;
}
_dirtyScore = false;
}
// Update power bar
}
}