Commit dec2689c authored by Viktor Lidholt's avatar Viktor Lidholt

Adds swarms of enemies to demo game

parent dcd17aef
library game; library game;
import 'dart:async'; import 'dart:async';
import 'dart:math' as math;
import 'dart:sky' as sky; import 'dart:sky' as sky;
import 'sprites.dart'; import 'sprites.dart';
......
...@@ -3,6 +3,9 @@ part of game; ...@@ -3,6 +3,9 @@ part of game;
final double _gameSizeWidth = 320.0; final double _gameSizeWidth = 320.0;
double _gameSizeHeight = 320.0; double _gameSizeHeight = 320.0;
final double _chunkSpacing = 640.0;
final int _chunksPerLevel = 5;
final bool _drawDebug = false; final bool _drawDebug = false;
class GameDemoNode extends NodeWithSize { class GameDemoNode extends NodeWithSize {
...@@ -164,7 +167,6 @@ class GameDemoNode extends NodeWithSize { ...@@ -164,7 +167,6 @@ class GameDemoNode extends NodeWithSize {
} }
int _chunk = 0; int _chunk = 0;
double _chunkSpacing = 640.0;
void addObjects() { void addObjects() {
...@@ -181,21 +183,24 @@ class GameDemoNode extends NodeWithSize { ...@@ -181,21 +183,24 @@ class GameDemoNode extends NodeWithSize {
if (chunk == 0) { if (chunk == 0) {
// Leave the first chunk empty // Leave the first chunk empty
return; return;
} else if (chunk == 1) {
addLevelAsteroids(10, yPos, 0.0);
} else {
addLevelAsteroids(9 + chunk, yPos, 0.5);
} }
}
void addLevelAsteroids(int numAsteroids, double yPos, double distribution) { chunk -= 1;
for (int i = 0; i < numAsteroids; i++) {
GameObjectType type = (randomDouble() < distribution) ? GameObjectType.asteroidBig : GameObjectType.asteroidSmall; int level = chunk ~/ _chunksPerLevel;
Point pos = new Point(randomSignedDouble() * 160.0, int part = chunk % _chunksPerLevel;
yPos + _chunkSpacing * randomDouble());
_objectFactory.addGameObject(type, pos); if (part == 0) {
_objectFactory.addAsteroids(10 + level * 4, yPos, 0.0 + (level * 0.2).clamp(0.0, 0.7));
} else if (part == 1) {
_objectFactory.addSwarm(4 + level * 2, yPos);
} else if (part == 2) {
_objectFactory.addAsteroids(10 + level * 4, yPos, 0.0 + (level * 0.2).clamp(0.0, 0.7));
} else if (part == 3) {
_objectFactory.addAsteroids(10 + level * 4, yPos, 0.0 + (level * 0.2).clamp(0.0, 0.7));
} else if (part == 4) {
_objectFactory.addAsteroids(10 + level * 4, yPos, 0.0 + (level * 0.2).clamp(0.0, 0.7));
} }
_objectFactory.addGameObject(GameObjectType.movingEnemy, new Point(0.0, yPos + 160.0));
} }
void fire() { void fire() {
...@@ -434,20 +439,41 @@ class MovingEnemy extends Obstacle { ...@@ -434,20 +439,41 @@ class MovingEnemy extends Obstacle {
constraints = [new ConstraintRotationToMovement(0.0, 0.5)]; constraints = [new ConstraintRotationToMovement(0.0, 0.5)];
} }
final double _swirlSpacing = 80.0;
_addRandomSquare(List<Offset> offsets, double x, double y) {
double xMove = (randomDouble() < 0.5) ? _swirlSpacing : -_swirlSpacing;
double yMove = (randomDouble() < 0.5) ? _swirlSpacing : -_swirlSpacing;
if (randomDouble() < 0.5) {
offsets.add(new Offset(x, y));
offsets.add(new Offset(xMove + x, y));
offsets.add(new Offset(xMove + x, yMove + y));
offsets.add(new Offset(x, yMove + y));
offsets.add(new Offset(x, y));
} else {
offsets.add(new Offset(x, y));
offsets.add(new Offset(x, y + yMove));
offsets.add(new Offset(xMove + x, yMove + y));
offsets.add(new Offset(xMove + x, y));
offsets.add(new Offset(x, y));
}
}
void setupActions() { void setupActions() {
List<Offset> offsets = [
new Offset(-160.0, 160.0), List<Offset> offsets = [];
new Offset(-80.0, -160.0), _addRandomSquare(offsets, -_swirlSpacing, 0.0);
new Offset(0.0, 160.0), _addRandomSquare(offsets, _swirlSpacing, 0.0);
new Offset(80.0, -160.0), offsets.add(new Offset(-_swirlSpacing, 0.0));
new Offset(160.0, 160.0)];
List<Point> points = []; List<Point> points = [];
for (Offset offset in offsets) { for (Offset offset in offsets) {
points.add(position + offset); points.add(position + offset);
} }
ActionSpline spline = new ActionSpline((a) => position = a, points, 4.0); ActionSpline spline = new ActionSpline((a) => position = a, points, 6.0);
spline.tension = 0.7;
actions.run(new ActionRepeatForever(spline)); actions.run(new ActionRepeatForever(spline));
} }
...@@ -467,6 +493,23 @@ class GameObjectFactory { ...@@ -467,6 +493,23 @@ class GameObjectFactory {
Map<String,SoundEffect> sounds; Map<String,SoundEffect> sounds;
Level level; Level level;
void addAsteroids(int numAsteroids, double yPos, double distribution) {
for (int i = 0; i < numAsteroids; i++) {
GameObjectType type = (randomDouble() < distribution) ? GameObjectType.asteroidBig : GameObjectType.asteroidSmall;
Point pos = new Point(randomSignedDouble() * 160.0,
yPos + _chunkSpacing * randomDouble());
addGameObject(type, pos);
}
}
void addSwarm(int numEnemies, double yPos) {
for (int i = 0; i < numEnemies; i++) {
double spacing = math.max(_chunkSpacing / (numEnemies + 1.0), 80.0);
double y = yPos + _chunkSpacing / 2.0 - (numEnemies - 1) * spacing / 2.0 + i * spacing;
addGameObject(GameObjectType.movingEnemy, new Point(0.0, y));
}
}
void addGameObject(GameObjectType type, Point pos) { void addGameObject(GameObjectType type, Point pos) {
GameObject obj; GameObject obj;
if (type == GameObjectType.asteroidBig) if (type == GameObjectType.asteroidBig)
......
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