forked from marco/firo_runner
Added moving wall obstacles.
This commit is contained in:
parent
19b401d84f
commit
df5814820b
BIN
assets/images/wall-frames.png
Normal file
BIN
assets/images/wall-frames.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 108 KiB |
@ -9,6 +9,7 @@ import 'package:firo_runner/game_state.dart';
|
|||||||
import 'package:firo_runner/moving_object.dart';
|
import 'package:firo_runner/moving_object.dart';
|
||||||
import 'package:firo_runner/platform.dart';
|
import 'package:firo_runner/platform.dart';
|
||||||
import 'package:firo_runner/platform_holder.dart';
|
import 'package:firo_runner/platform_holder.dart';
|
||||||
|
import 'package:firo_runner/wall_holder.dart';
|
||||||
import 'package:firo_runner/wire.dart';
|
import 'package:firo_runner/wire.dart';
|
||||||
import 'package:firo_runner/wire_holder.dart';
|
import 'package:firo_runner/wire_holder.dart';
|
||||||
import 'package:flame/components.dart';
|
import 'package:flame/components.dart';
|
||||||
@ -36,6 +37,7 @@ const RUNNER_PRIORITY = 100;
|
|||||||
const BUG_PRIORITY = 75;
|
const BUG_PRIORITY = 75;
|
||||||
const COIN_PRIORITY = 70;
|
const COIN_PRIORITY = 70;
|
||||||
const PLATFORM_PRIORITY = 50;
|
const PLATFORM_PRIORITY = 50;
|
||||||
|
const WALL_PRIORITY = 40;
|
||||||
const DEBRIS_PRIORITY = 30;
|
const DEBRIS_PRIORITY = 30;
|
||||||
const WIRE_PRIORITY = 25;
|
const WIRE_PRIORITY = 25;
|
||||||
const FIREWORK_PRIORITY = 15;
|
const FIREWORK_PRIORITY = 15;
|
||||||
@ -72,6 +74,7 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
late BugHolder bugHolder;
|
late BugHolder bugHolder;
|
||||||
late Firework fireworks;
|
late Firework fireworks;
|
||||||
late DebrisHolder debrisHolder;
|
late DebrisHolder debrisHolder;
|
||||||
|
late WallHolder wallHolder;
|
||||||
Random random = Random();
|
Random random = Random();
|
||||||
bool playingMusic = false;
|
bool playingMusic = false;
|
||||||
|
|
||||||
@ -106,6 +109,8 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
await bugHolder.load();
|
await bugHolder.load();
|
||||||
debrisHolder = DebrisHolder();
|
debrisHolder = DebrisHolder();
|
||||||
await debrisHolder.load();
|
await debrisHolder.load();
|
||||||
|
wallHolder = WallHolder();
|
||||||
|
await wallHolder.load();
|
||||||
fireworks = Firework(this);
|
fireworks = Firework(this);
|
||||||
await fireworks.load();
|
await fireworks.load();
|
||||||
|
|
||||||
@ -154,14 +159,19 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
if (choseCoinLevel % 3 != 2 && choseCoinLevel != 6) {
|
if (choseCoinLevel % 3 != 2 && choseCoinLevel != 6) {
|
||||||
coinHolder.generateCoin(this, choseCoinLevel, false);
|
coinHolder.generateCoin(this, choseCoinLevel, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wallChosenRegion = random.nextInt(9);
|
||||||
|
if (wallChosenRegion % 3 == 1 && wallChosenRegion != 7) {
|
||||||
|
wallHolder.generateWall(this, wallChosenRegion, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isTooNearOtherObstacles(Rect rect) {
|
bool isTooNearOtherObstacles(Rect rect) {
|
||||||
Rect obstacleBounds = Rect.fromLTRB(
|
Rect obstacleBounds = Rect.fromLTRB(
|
||||||
3 * rect.left - 2 * rect.right - 1,
|
3 * rect.left - 2 * (rect.left + blockSize) - 1,
|
||||||
3 * rect.top - 2 * rect.bottom - 1,
|
3 * rect.top - 2 * (rect.top + blockSize) - 1,
|
||||||
3 * rect.right - 2 * rect.left + 1,
|
3 * (rect.left + blockSize) - 2 * rect.left + 1,
|
||||||
3 * rect.bottom - 2 * rect.top + 1);
|
3 * (rect.top + blockSize) - 2 * rect.top + 1);
|
||||||
for (List<MovingObject> wireLevel in wireHolder.objects) {
|
for (List<MovingObject> wireLevel in wireHolder.objects) {
|
||||||
for (MovingObject wire in wireLevel) {
|
for (MovingObject wire in wireLevel) {
|
||||||
if (wire.intersect(obstacleBounds) != "none") {
|
if (wire.intersect(obstacleBounds) != "none") {
|
||||||
@ -194,6 +204,14 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (List<MovingObject> wallLevel in wallHolder.objects) {
|
||||||
|
for (MovingObject wall in wallLevel) {
|
||||||
|
if (wall.intersect(obstacleBounds) != "none") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,6 +244,7 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
wireHolder.setUp();
|
wireHolder.setUp();
|
||||||
bugHolder.setUp();
|
bugHolder.setUp();
|
||||||
debrisHolder.setUp();
|
debrisHolder.setUp();
|
||||||
|
wallHolder.setUp();
|
||||||
|
|
||||||
gameState.setUp(this);
|
gameState.setUp(this);
|
||||||
|
|
||||||
@ -257,6 +276,7 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
wireHolder.removePast(this);
|
wireHolder.removePast(this);
|
||||||
bugHolder.removePast(this);
|
bugHolder.removePast(this);
|
||||||
debrisHolder.removePast(this);
|
debrisHolder.removePast(this);
|
||||||
|
wallHolder.removePast(this);
|
||||||
fillScreen();
|
fillScreen();
|
||||||
super.update(dt);
|
super.update(dt);
|
||||||
circuitBackground.update(dt);
|
circuitBackground.update(dt);
|
||||||
@ -266,6 +286,7 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
wireHolder.update(dt);
|
wireHolder.update(dt);
|
||||||
bugHolder.update(dt);
|
bugHolder.update(dt);
|
||||||
debrisHolder.update(dt);
|
debrisHolder.update(dt);
|
||||||
|
wallHolder.update(dt);
|
||||||
if (shouldReset) {
|
if (shouldReset) {
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
@ -286,6 +307,7 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents {
|
|||||||
wireHolder.resize(canvasSize, xRatio, yRatio);
|
wireHolder.resize(canvasSize, xRatio, yRatio);
|
||||||
bugHolder.resize(canvasSize, xRatio, yRatio);
|
bugHolder.resize(canvasSize, xRatio, yRatio);
|
||||||
debrisHolder.resize(canvasSize, xRatio, yRatio);
|
debrisHolder.resize(canvasSize, xRatio, yRatio);
|
||||||
|
wallHolder.resize(canvasSize, xRatio, yRatio);
|
||||||
fireworks.resize(canvasSize, xRatio, yRatio);
|
fireworks.resize(canvasSize, xRatio, yRatio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -412,8 +412,23 @@ class Runner extends Component with HasGameRef<MyGame> {
|
|||||||
String intersectState = debrisLevel[i].intersect(slim);
|
String intersectState = debrisLevel[i].intersect(slim);
|
||||||
if (intersectState == "none") {
|
if (intersectState == "none") {
|
||||||
continue;
|
continue;
|
||||||
} else if ((runnerState == "duck" || runnerState == "float") &&
|
} else if (runnerState == "duck" && intersectState != "above") {
|
||||||
intersectState != "above") {
|
continue;
|
||||||
|
} else {
|
||||||
|
event("die");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (List<MovingObject> debrisLevel in gameRef.wallHolder.objects) {
|
||||||
|
for (int i = 0; i < debrisLevel.length; i++) {
|
||||||
|
Rect slim = Rect.fromLTRB(
|
||||||
|
runnerRect.left + sprite.width / 3,
|
||||||
|
runnerRect.top + sprite.height / (runnerState == "duck" ? 3 : 6),
|
||||||
|
runnerRect.right - sprite.width / 3,
|
||||||
|
runnerRect.bottom - sprite.height / 3);
|
||||||
|
String intersectState = debrisLevel[i].intersect(slim);
|
||||||
|
if (intersectState == "none") {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
event("die");
|
event("die");
|
||||||
|
54
lib/wall.dart
Normal file
54
lib/wall.dart
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import 'package:firo_runner/moving_object.dart';
|
||||||
|
import 'package:firo_runner/main.dart';
|
||||||
|
import 'package:flame/components.dart';
|
||||||
|
|
||||||
|
enum WallState { normal }
|
||||||
|
|
||||||
|
class Wall extends MovingObject {
|
||||||
|
int direction = -1;
|
||||||
|
late int bottomPlatformLevel;
|
||||||
|
Wall(MyGame gameRef) : super(gameRef) {
|
||||||
|
var wall = gameRef.wallHolder.getWall();
|
||||||
|
SpriteAnimation normal = SpriteAnimation.fromFrameData(
|
||||||
|
wall,
|
||||||
|
SpriteAnimationData.sequenced(
|
||||||
|
amount: 5,
|
||||||
|
stepTime: 0.1,
|
||||||
|
textureSize: Vector2(163, 1000),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
sprite = SpriteAnimationGroupComponent(
|
||||||
|
animations: {
|
||||||
|
WallState.normal: normal,
|
||||||
|
},
|
||||||
|
current: WallState.normal,
|
||||||
|
);
|
||||||
|
|
||||||
|
sprite.changePriorityWithoutResorting(WALL_PRIORITY);
|
||||||
|
|
||||||
|
setSize(
|
||||||
|
gameRef.blockSize *
|
||||||
|
(gameRef.wallHolder.wall.width / gameRef.wallHolder.wall.height / 5) *
|
||||||
|
2.0,
|
||||||
|
gameRef.blockSize * 0.5,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void update(double dt) {
|
||||||
|
super.update(dt);
|
||||||
|
int nearestPlatform =
|
||||||
|
getNearestPlatform((sprite.x / gameRef.blockSize).round());
|
||||||
|
nearestPlatform = nearestPlatform == 0 ? -1 : nearestPlatform;
|
||||||
|
if (sprite.y + sprite.height > bottomPlatformLevel * gameRef.blockSize) {
|
||||||
|
direction = -1;
|
||||||
|
} else if ((bottomPlatformLevel - 2) * gameRef.blockSize -
|
||||||
|
2 * gameRef.blockSize / 7 >
|
||||||
|
sprite.y) {
|
||||||
|
direction = 1;
|
||||||
|
}
|
||||||
|
double velocity = gameRef.gameState.getVelocity() / 10.0;
|
||||||
|
sprite.position = sprite.position + Vector2(0, direction * velocity * dt);
|
||||||
|
}
|
||||||
|
}
|
65
lib/wall_holder.dart
Normal file
65
lib/wall_holder.dart
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import 'package:firo_runner/holder.dart';
|
||||||
|
import 'package:firo_runner/platform.dart';
|
||||||
|
import 'package:flame/extensions.dart';
|
||||||
|
import 'package:flame/flame.dart';
|
||||||
|
|
||||||
|
import 'package:firo_runner/wall.dart';
|
||||||
|
import 'package:firo_runner/main.dart';
|
||||||
|
|
||||||
|
class WallHolder extends Holder {
|
||||||
|
late Image wall;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future load() async {
|
||||||
|
wall = await Flame.images.load("wall-frames.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
getWall() {
|
||||||
|
return wall;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool generateWall(MyGame gameRef, int level, bool force) {
|
||||||
|
if (objects[level].isNotEmpty) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (random.nextInt(100) > 25) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
int nearestPlatform = getNearestPlatform(level);
|
||||||
|
|
||||||
|
Platform? platform =
|
||||||
|
gameRef.platformHolder.getPlatformOffScreen(nearestPlatform);
|
||||||
|
if (platform != null && platform.prohibitObstacles) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
double xCoordinate = -100;
|
||||||
|
|
||||||
|
if (level == 0) {
|
||||||
|
xCoordinate = gameRef.size.x;
|
||||||
|
} else if (platform != null) {
|
||||||
|
xCoordinate = platform.sprite.x;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Wall wall = Wall(gameRef);
|
||||||
|
wall.setPosition(xCoordinate, gameRef.blockSize * level);
|
||||||
|
wall.bottomPlatformLevel = level + 1;
|
||||||
|
|
||||||
|
if (gameRef.isTooNearOtherObstacles(wall.sprite.toRect())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
objects[level].add(wall);
|
||||||
|
gameRef.add(wall.sprite);
|
||||||
|
if (platform != null) {
|
||||||
|
platform.removeChildren.add(() {
|
||||||
|
objects[level].remove(wall);
|
||||||
|
wall.remove();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user