diff --git a/lib/BugHolder.dart b/lib/BugHolder.dart index 6e29eaa..1cca3c4 100644 --- a/lib/BugHolder.dart +++ b/lib/BugHolder.dart @@ -16,6 +16,15 @@ class BugHolder { Future loadBugs() async { bug = await Flame.images.load("bug-frames.png"); breaking = await Flame.images.load("bug-break-frames.png"); + } + + void setUp() { + for (int i = 0; i < bugs.length; i++) { + for (int j = 0; j < bugs[i].length; j++) { + remove(bugs[i], j); + } + } + bugs = []; for (int i = 0; i < 9; i++) { bugs.add([]); } @@ -93,12 +102,17 @@ class BugHolder { } } + void remove(List levelHolder, int j) { + levelHolder[j].remove(); + levelHolder[j].sprite.remove(); + levelHolder.removeAt(j); + } + void removePast(MyGame gameRef) { for (List bugLevel in bugs) { for (int i = 0; i < bugLevel.length;) { if (bugLevel[i].sprite.x + bugLevel[i].sprite.width < 0) { - bugLevel[i].sprite.remove(); - bugLevel.removeAt(i); + remove(bugLevel, i); continue; } i++; diff --git a/lib/CircuitBackground.dart b/lib/CircuitBackground.dart index 4835c80..a86a864 100644 --- a/lib/CircuitBackground.dart +++ b/lib/CircuitBackground.dart @@ -19,7 +19,11 @@ class CircuitBackground extends MovingObject { background = await Flame.images.load("bg.png"); background1 = Sprite(background); background2 = Sprite(background); + setUp(); + } + void setUp() { + background1Position = Vector2(0, 0); background1Size = Vector2( gameRef.size.y * (background!.width / background!.height), gameRef.size.y); diff --git a/lib/CoinHolder.dart b/lib/CoinHolder.dart index 5d556b8..e60c2d9 100644 --- a/lib/CoinHolder.dart +++ b/lib/CoinHolder.dart @@ -13,6 +13,15 @@ class CoinHolder { Future loadCoins() async { coin = await Flame.images.load("coin-frames.png"); + } + + void setUp() { + for (int i = 0; i < coins.length; i++) { + for (int j = 0; j < coins[i].length; j++) { + remove(coins[i], j); + } + } + coins = []; for (int i = 0; i < 9; i++) { coins.add([]); } @@ -63,12 +72,17 @@ class CoinHolder { } } + void remove(List levelHolder, int j) { + levelHolder[j].remove(); + levelHolder[j].sprite.remove(); + levelHolder.removeAt(j); + } + void removePast(MyGame gameRef) { for (List coinLevel in coins) { for (int i = 0; i < coinLevel.length;) { if (coinLevel[i].sprite.x + coinLevel[i].sprite.width < 0) { - coinLevel[i].sprite.remove(); - coinLevel.removeAt(i); + remove(coinLevel, i); continue; } i++; diff --git a/lib/GameState.dart b/lib/GameState.dart index a7b7055..13e7b83 100644 --- a/lib/GameState.dart +++ b/lib/GameState.dart @@ -4,19 +4,23 @@ import 'package:flame/components.dart'; import 'package:flutter/material.dart'; class GameState extends Component { - int numCoins = 0; - int distance = 0; + static const int CIRCUIT_PERIOD = 500000; late Rect square; late Color color = Colors.white; - int start = 0; late ColorTween tween; - static const int CIRCUIT_PERIOD = 500000; + + int start = 0; + bool isPaused = false; + int numCoins = 0; + int distance = 0; @override void update(double dt) { super.update(dt); - distance = DateTime.now().microsecondsSinceEpoch - start; - color = tween.lerp(sin(distance.toDouble() / CIRCUIT_PERIOD))!; + if (!isPaused) { + distance = DateTime.now().microsecondsSinceEpoch - start; + color = tween.lerp(sin(distance.toDouble() / CIRCUIT_PERIOD))!; + } } void addCoin() { @@ -31,25 +35,35 @@ class GameState extends Component { Future load(Vector2 size) async { square = Rect.fromLTWH(0, 0, size.x, size.y); - reset(); } void setSize(Vector2 size) { square = Rect.fromLTWH(0, 0, size.x, size.y); } - void reset() { + void setUp() { + numCoins = 0; + distance = 0; start = DateTime.now().microsecondsSinceEpoch; tween = ColorTween(begin: Colors.yellow, end: Colors.yellowAccent); + isPaused = false; + } + + void setPaused() { + isPaused = true; } double getVelocity() { - if (distance > 50000000) { - return 250.0; - } else if (distance > 10000000) - return 175.0; - else { - return 100.0; + if (!isPaused) { + if (distance > 50000000) { + return 250.0; + } else if (distance > 10000000) + return 175.0; + else { + return 100.0; + } + } else { + return 0; } } } diff --git a/lib/PlatformHolder.dart b/lib/PlatformHolder.dart index 6703150..2a12580 100644 --- a/lib/PlatformHolder.dart +++ b/lib/PlatformHolder.dart @@ -15,6 +15,15 @@ class PlatformHolder { platform1 = await Flame.images.load('p1-frames.png'); platform2 = await Flame.images.load('p2-frames.png'); platform3 = await Flame.images.load('p3-frames.png'); + } + + void setUp() { + for (int i = 0; i < platforms.length; i++) { + for (int j = 0; j < platforms[i].length; j++) { + remove(platforms[i], j); + } + } + platforms = []; for (int i = 0; i < 9; i++) { platforms.add([]); } @@ -56,14 +65,20 @@ class PlatformHolder { } } + void remove(List levelHolder, int j) { + levelHolder[j].remove(); + levelHolder[j].sprite.remove(); + levelHolder.removeAt(j); + print("removed platform"); + } + void removePast(MyGame gameRef) { for (List platformLevel in platforms) { int removed = 0; while (platformLevel.isNotEmpty && platformLevel[0].sprite.position.x + platformLevel[0].sprite.width < 0) { - platformLevel[0].sprite.remove(); - platformLevel.removeAt(0); + remove(platformLevel, 0); removed++; } if (platformLevel.isNotEmpty && @@ -74,13 +89,8 @@ class PlatformHolder { double secondToLastPosition = platformLevel.elementAt(secondToLast).sprite.x; if (secondToLastPosition > gameRef.size.x) { - platformLevel[secondToLast].remove(); - platformLevel[secondToLast].sprite.remove(); - platformLevel.removeAt(secondToLast); - - platformLevel[secondToLast + 1].remove(); - platformLevel[secondToLast + 1].sprite.remove(); - platformLevel.removeAt(secondToLast + 1); + remove(platformLevel, secondToLast + 1); + remove(platformLevel, secondToLast); } } } diff --git a/lib/Runner.dart b/lib/Runner.dart index 33799ec..09367d0 100644 --- a/lib/Runner.dart +++ b/lib/Runner.dart @@ -22,6 +22,27 @@ enum RunnerState { class Runner extends Component with HasGameRef { late SpriteAnimationGroupComponent sprite; String runnerState = "run"; + int level = 4; + String previousState = "run"; + var runnerPosition = Vector2(0, 0); + var runnerSize; + bool dead = false; + + void setUp() { + dead = false; + runnerState = "run"; + previousState = "run"; + level = 4; + + runnerSize = Vector2( + gameRef.size.y / 9, + gameRef.size.y / 9, + ); + + setSize(runnerSize, gameRef.blockSize); + runnerPosition = Vector2(gameRef.blockSize, gameRef.blockSize * 4); + setPosition(runnerPosition); + } void setPosition(Vector2 position) { sprite.position = position; @@ -41,15 +62,14 @@ class Runner extends Component with HasGameRef { getSprite().render(c, position: sprite.position, size: sprite.size); } - int level = 1; - void updateLevel() { level = (sprite.position.y / gameRef.blockSize).round(); } - String previousState = "run"; - void event(String event) { + if (gameRef.gameState.isPaused) { + return; + } previousState = runnerState; print(event); switch (event) { @@ -129,12 +149,20 @@ class Runner extends Component with HasGameRef { sprite.current = RunnerState.duck; break; case "die": + if (dead) { + return; + } runnerState = event; sprite.current = RunnerState.die; + gameRef.die(); break; case "electro": + if (dead) { + return; + } runnerState = event; sprite.current = RunnerState.electro; + gameRef.die(); break; default: break; @@ -142,6 +170,9 @@ class Runner extends Component with HasGameRef { } void control(String input) { + if (gameRef.gameState.isPaused) { + return; + } print(input); switch (input) { case "up": @@ -190,7 +221,6 @@ class Runner extends Component with HasGameRef { intersecting(); sprite.update(dt); - print(runnerState); } bool onTopOfPlatform() { @@ -212,6 +242,9 @@ class Runner extends Component with HasGameRef { } void intersecting() { + if (gameRef.gameState.isPaused) { + return; + } Rect runnerRect = sprite.toRect(); bool onTopOfPlatform = false; for (List platformLevel in gameRef.platformHolder.platforms) { @@ -234,8 +267,7 @@ class Runner extends Component with HasGameRef { for (int i = 0; i < coinLevel.length;) { if (coinLevel[i].intersect(runnerRect) != "none") { gameRef.gameState.numCoins++; - coinLevel[i].remove(); - coinLevel.removeAt(i); + gameRef.coinHolder.remove(coinLevel, i); print(gameRef.gameState.numCoins); continue; } @@ -247,6 +279,7 @@ class Runner extends Component with HasGameRef { for (int i = 0; i < wireLevel.length; i++) { if (wireLevel[i].intersect(runnerRect) != "none") { event("electro"); + return; } } } @@ -266,6 +299,7 @@ class Runner extends Component with HasGameRef { continue; } else if (aboveIntersect != "none") { event("die"); + return; } } else if (intersectState == "left" && runnerState == "kick") { bugLevel[i].sprite.current = BugState.breaking; @@ -273,6 +307,7 @@ class Runner extends Component with HasGameRef { // bugLevel.removeAt(i); } else { event("die"); + return; } } } @@ -356,8 +391,9 @@ class Runner extends Component with HasGameRef { 'electrocuted-frames.png', SpriteAnimationData.sequenced( amount: 2, - stepTime: 0.1, + stepTime: 0.25, textureSize: Vector2(512, 512), + loop: false, ), ); diff --git a/lib/WireHolder.dart b/lib/WireHolder.dart index 3d71488..c4adb35 100644 --- a/lib/WireHolder.dart +++ b/lib/WireHolder.dart @@ -14,6 +14,15 @@ class WireHolder { Future loadWires() async { wire = await Flame.images.load("wire-frames.png"); + } + + void setUp() { + for (int i = 0; i < wires.length; i++) { + for (int j = 0; j < wires[i].length; j++) { + remove(wires[i], j); + } + } + wires = []; for (int i = 0; i < 9; i++) { wires.add([]); } @@ -52,6 +61,7 @@ class WireHolder { } Wire wire = Wire(gameRef); + wire.sprite.renderFlipX = true; if (level % 3 == 0) { wire.sprite.renderFlipY = true; wire.setPosition( @@ -93,12 +103,17 @@ class WireHolder { } } + void remove(List levelHolder, int j) { + levelHolder[j].remove(); + levelHolder[j].sprite.remove(); + levelHolder.removeAt(j); + } + void removePast(MyGame gameRef) { for (List wireLevel in wires) { for (int i = 0; i < wireLevel.length;) { if (wireLevel[i].sprite.x + wireLevel[i].sprite.width < 0) { - wireLevel[i].sprite.remove(); - wireLevel.removeAt(i); + remove(wireLevel, i); continue; } i++; diff --git a/lib/main.dart b/lib/main.dart index ecace29..814da69 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,17 +48,8 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { late BugHolder bugHolder; Random random = Random(); - // late Sprite background1; - // late Sprite background2; late Runner runner; late GameState gameState; - // var background; - - var runnerPosition = Vector2(0, 0); - var runnerSize; - // var backgroundSize; - // var background1Position; - // var background2Position; late double blockSize; bool loaded = false; @@ -68,9 +59,6 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { Future onLoad() async { // debugMode = true; FlameAudio.bgm.initialize(); - // background = await Flame.images.load('bg.png'); - // background1 = Sprite(background); - // background2 = Sprite(background); circuitBackground = CircuitBackground(this); await circuitBackground.load(); @@ -88,22 +76,16 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { runner = Runner(); await runner.load(loadSpriteAnimation); - runner.setSize(runnerSize, blockSize); - runnerPosition = Vector2(blockSize, blockSize * 1); - runner.setPosition(runnerPosition); - add(runner); - - // Generate the first 4 Platforms that will always be there at the start. - for (int i = 0; i < 4; i++) { - platformHolder.generatePlatform(this, 8, true); - } - fillScreen(); FlameAudio.bgm.play('Infinite_Spankage_M.mp3'); loaded = true; + setUp(); } void fillScreen() { + if (shouldReset) { + return; + } for (int i = 2; i < 9; i = i + 3) { while (!platformHolder.generatePlatform(this, i, false)) {} } @@ -156,15 +138,48 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { return false; } + bool shouldReset = false; + + void reset() { + if (!(runner.sprite.animation?.done() ?? false)) { + return; + } + runner.sprite.animation!.reset(); + shouldReset = false; + this.components.clear(); + setUp(); + } + + void die() { + gameState.setPaused(); + shouldReset = true; + } + + void setUp() { + add(runner); + runner.sprite.clearEffects(); + runner.sprite.current = RunnerState.run; + circuitBackground.setUp(); + platformHolder.setUp(); + coinHolder.setUp(); + wireHolder.setUp(); + bugHolder.setUp(); + + gameState.setUp(); + + runner.setUp(); + + // Generate the first 4 Platforms that will always be there at the start. + for (int i = 0; i < 4; i++) { + platformHolder.generatePlatform(this, 8, true); + } + fillScreen(); + } + @override void render(Canvas canvas) { gameState.render(canvas); circuitBackground.render(canvas); - // background1.render( - // canvas, - // position: Vector2(0, 0), - // size: Vector2(size.y * (background!.width / background!.height), size.y), - // ); super.render(canvas); final fpsCount = fps(1); textPaint.render( @@ -188,20 +203,18 @@ class MyGame extends BaseGame with PanDetector, TapDetector, KeyboardEvents { coinHolder.update(dt); wireHolder.update(dt); bugHolder.update(dt); + if (shouldReset) { + print("should reset"); + reset(); + } } @override void onResize(Vector2 size) { super.onResize(size); blockSize = size.y / 9; - runnerSize = Vector2( - size.y / 9, - size.y / 9, - ); if (loaded) { - // backgroundSize = - // Vector2(size.y * (background!.width / background!.height), size.y); gameState.setSize(size); } }