mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Merge pull request #859 from vlidholt/master
Adds power ups to demo game
This commit is contained in:
commit
d7a7a2ed29
@ -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;
|
||||
|
||||
|
||||
@ -1,13 +1,18 @@
|
||||
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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user