diff --git a/lib/bug_holder.dart b/lib/bug_holder.dart index 2dd9a6c..c79d49c 100644 --- a/lib/bug_holder.dart +++ b/lib/bug_holder.dart @@ -48,16 +48,13 @@ class BugHolder { if (random.nextInt(100) > 25) { return true; } else { - int nearestPlatform = level <= 0 - ? 0 - : level <= 3 - ? 2 - : level <= 6 - ? 5 - : 8; + int nearestPlatform = gameRef.platformHolder.getNearestPlatform(level); Platform? platform = gameRef.platformHolder.getPlatformOffScreen(nearestPlatform); + if (platform != null && platform.prohibitObstacles) { + return false; + } double xCoordinate = -100; if (level == 0) { diff --git a/lib/coin_holder.dart b/lib/coin_holder.dart index 220bf76..fca928f 100644 --- a/lib/coin_holder.dart +++ b/lib/coin_holder.dart @@ -45,13 +45,7 @@ class CoinHolder { if (random.nextInt(100) > 25) { return true; } else { - int nearestPlatform = level <= 0 - ? 0 - : level <= 3 - ? 2 - : level <= 6 - ? 5 - : 8; + int nearestPlatform = gameRef.platformHolder.getNearestPlatform(level); Platform? platform = gameRef.platformHolder.getPlatformOffScreen(nearestPlatform); diff --git a/lib/main.dart b/lib/main.dart index 65d0ac1..4eb39e9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -210,7 +210,7 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { circuitBackground.render(canvas); fireworks.renderText(canvas); super.render(canvas); - final fpsCount = fps(1); + final fpsCount = fps(10000); fireworksPaint.render( canvas, fpsCount.toString(), @@ -300,6 +300,8 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { if (!playingMusic && kIsWeb) { playMusic(); } + print(event.data.logicalKey.keyId); + print(event.data.keyLabel); if (event is RawKeyUpEvent) { keyboardKey = null; switch (event.data.keyLabel) { diff --git a/lib/platform.dart b/lib/platform.dart index 24dee9e..9690261 100644 --- a/lib/platform.dart +++ b/lib/platform.dart @@ -13,6 +13,7 @@ enum PlatformState { class Platform extends MovingObject { int row = 0; + bool prohibitObstacles = false; List removeChildren = []; Platform(MyGame gameRef) : super(gameRef) { diff --git a/lib/platform_holder.dart b/lib/platform_holder.dart index ff37b5f..644dfab 100644 --- a/lib/platform_holder.dart +++ b/lib/platform_holder.dart @@ -1,6 +1,8 @@ import 'dart:math'; +import 'package:firo_runner/bug.dart'; import 'package:firo_runner/main.dart'; +import 'package:firo_runner/wire.dart'; import 'package:flame/flame.dart'; import 'package:firo_runner/platform.dart'; import 'package:flame/extensions.dart'; @@ -44,6 +46,50 @@ class PlatformHolder { } } + void removeUnfairObstacles( + MyGame gameRef, Platform currentPlatform, int from, int to) { + for (int i = from; i <= to; i++) { + if (i == 0) { + for (Bug bug in gameRef.bugHolder.bugs[0]) { + if (bug.sprite.x >= currentPlatform.sprite.x && + bug.sprite.x < + currentPlatform.sprite.x + 4 * currentPlatform.sprite.width) { + gameRef.bugHolder.bugs[0].remove(bug); + bug.remove(); + } + } + for (Wire wire in gameRef.wireHolder.wires[0]) { + if (wire.sprite.x >= currentPlatform.sprite.x && + wire.sprite.x < + currentPlatform.sprite.x + 4 * currentPlatform.sprite.width) { + gameRef.wireHolder.wires[0].remove(wire); + wire.remove(); + } + } + } else { + int nearestPlatform = getNearestPlatform(i); + for (Platform platform in platforms[nearestPlatform]) { + if (platform.sprite.x >= currentPlatform.sprite.x && + platform.sprite.x < + currentPlatform.sprite.x + 4 * currentPlatform.sprite.width) { + platform.remove(); + platform.prohibitObstacles = true; + } + } + } + } + } + + int getNearestPlatform(int level) { + return level <= 0 + ? 0 + : level <= 3 + ? 2 + : level <= 6 + ? 5 + : 8; + } + void generatePlatforms(MyGame gameRef) { while (!generatePlatform(gameRef, 2)) { timeSinceLastTopHole++; @@ -58,8 +104,12 @@ class PlatformHolder { .nextInt(timeSinceLastBottomHole > 0 ? timeSinceLastBottomHole : 1); if (topChance > 50) { + removeUnfairObstacles( + gameRef, platforms[2][platforms[2].length - 4], 0, 4); + // Create an opening in the top. remove(platforms[2], platforms[2].length - 2); remove(platforms[2], platforms[2].length - 2); + timeSinceLastTopHole = 0; } if (bottomChance > 30) { @@ -70,10 +120,15 @@ class PlatformHolder { } int lastToRemove = platforms[5].length - 3; int firstToRemove = platforms[5].length - 10; + + removeUnfairObstacles(gameRef, platforms[5][lastToRemove - 1], 3, 7); remove(platforms[5], lastToRemove); remove(platforms[5], lastToRemove); + + removeUnfairObstacles(gameRef, platforms[5][firstToRemove - 1], 3, 7); remove(platforms[5], firstToRemove); remove(platforms[5], firstToRemove); + timeSinceLastBottomHole = 0; } } diff --git a/lib/runner.dart b/lib/runner.dart index 1060b6a..bbde8fd 100644 --- a/lib/runner.dart +++ b/lib/runner.dart @@ -82,7 +82,7 @@ class Runner extends Component with HasGameRef { // sprite.position, Vector2(sprite.x, (level - 1) * gameRef.blockSize), ], - speed: 150, + duration: 0.25, curve: Curves.bounceIn, onComplete: () { updateLevel(); @@ -91,6 +91,10 @@ class Runner extends Component with HasGameRef { )); break; case "double_jump": + if (belowPlatform()) { + break; + } + sprite.clearEffects(); if (level - 1 < 0) { break; } @@ -104,22 +108,31 @@ class Runner extends Component with HasGameRef { curve: Curves.ease, onComplete: () { updateLevel(); - this.event("float"); + if (onTopOfPlatform()) { + this.event("run"); + } else { + this.event("float"); + } }, )); break; case "fall": + sprite.clearEffects(); runnerState = event; sprite.current = RunnerState.fall; sprite.addEffect(MoveEffect( path: [ Vector2(sprite.x, (level + 1) * gameRef.blockSize), ], - speed: 100, + duration: 0.2, curve: Curves.ease, onComplete: () { updateLevel(); - this.event("float"); + if (onTopOfPlatform()) { + this.event("run"); + } else { + this.event("fall"); + } }, )); break; @@ -136,23 +149,36 @@ class Runner extends Component with HasGameRef { sprite.current = RunnerState.float; sprite.addEffect(MoveEffect( path: [sprite.position], - speed: 500, + duration: 1.5, curve: Curves.ease, onComplete: () { updateLevel(); - runnerState = event; - sprite.current = RunnerState.float; + if (onTopOfPlatform()) { + this.event("run"); + } else { + this.event("fall"); + } }, )); break; case "duck": runnerState = event; sprite.current = RunnerState.duck; + sprite.addEffect(MoveEffect( + path: [sprite.position], + duration: 1.5, + curve: Curves.linear, + onComplete: () { + this.event("run"); + }, + )); break; case "die": if (dead) { return; } + sprite.clearEffects(); + updateLevel(); runnerState = event; sprite.current = RunnerState.die; gameRef.die(); @@ -161,6 +187,8 @@ class Runner extends Component with HasGameRef { if (dead) { return; } + sprite.clearEffects(); + updateLevel(); runnerState = event; sprite.current = RunnerState.electrocute; gameRef.die(); @@ -169,6 +197,8 @@ class Runner extends Component with HasGameRef { if (dead) { return; } + sprite.clearEffects(); + updateLevel(); runnerState = event; sprite.current = RunnerState.glitch; gameRef.die(); @@ -189,6 +219,7 @@ class Runner extends Component with HasGameRef { } else if (runnerState == "float" && previousState == "jump") { event("double_jump"); } else if (runnerState == "duck") { + sprite.clearEffects(); event("run"); } break; @@ -196,8 +227,10 @@ class Runner extends Component with HasGameRef { if (runnerState == "run") { event("duck"); } else if (runnerState == "float" && onTopOfPlatform()) { + sprite.clearEffects(); event("run"); } else if (runnerState == "float") { + sprite.clearEffects(); event("fall"); } break; @@ -207,10 +240,10 @@ class Runner extends Component with HasGameRef { } break; case "center": - if (runnerState == "fall") { - updateLevel(); - event("float"); - } + // if (runnerState == "fall") { + // updateLevel(); + // event("float"); + // } break; } } @@ -252,6 +285,24 @@ class Runner extends Component with HasGameRef { return onTopOfPlatform; } + bool belowPlatform() { + Rect runnerRect = sprite.toRect(); + bool belowPlatform = false; + for (List platformLevel in gameRef.platformHolder.platforms) { + for (Platform p in platformLevel) { + String side = p.intersect(runnerRect); + if (side == "none") { + Rect belowRunner = Rect.fromLTRB(runnerRect.left, runnerRect.top - 1, + runnerRect.right, runnerRect.bottom); + if (p.intersect(belowRunner) == "bottom") { + belowPlatform = true; + } + } + } + } + return belowPlatform; + } + void intersecting() { if (gameRef.gameState.isPaused) { return; @@ -268,7 +319,7 @@ class Runner extends Component with HasGameRef { onTopOfPlatform = true; } } else if (side == "bottom") { - event("die"); + // event("die"); return; } } diff --git a/lib/wire_holder.dart b/lib/wire_holder.dart index 09cfe72..5e94415 100644 --- a/lib/wire_holder.dart +++ b/lib/wire_holder.dart @@ -41,16 +41,13 @@ class WireHolder { if (random.nextInt(100) > 100) { return true; } else { - int nearestPlatform = level <= 0 - ? 0 - : level <= 3 - ? 2 - : level <= 6 - ? 5 - : 8; + int nearestPlatform = gameRef.platformHolder.getNearestPlatform(level); Platform? platform = gameRef.platformHolder.getPlatformOffScreen(nearestPlatform); + if (platform != null && platform.prohibitObstacles) { + return false; + } double xCoordinate = -100; if (level == 0) {