2021-09-03 23:29:18 +00:00
|
|
|
import 'dart:math';
|
|
|
|
|
|
|
|
import 'package:firo_runner/main.dart';
|
|
|
|
import 'package:flame/flame.dart';
|
2021-09-08 21:44:12 +00:00
|
|
|
import 'package:firo_runner/platform.dart';
|
|
|
|
import 'package:flame/extensions.dart';
|
2021-09-03 23:29:18 +00:00
|
|
|
|
|
|
|
class PlatformHolder {
|
2021-09-08 21:44:12 +00:00
|
|
|
late Image l1;
|
|
|
|
late Image l2;
|
|
|
|
late Image m1;
|
|
|
|
late Image m2;
|
|
|
|
late Image r1;
|
|
|
|
late Image r2;
|
|
|
|
late Image o1;
|
|
|
|
late Image o2;
|
2021-09-03 23:29:18 +00:00
|
|
|
late List<List<Platform>> platforms = [];
|
2021-09-11 02:39:32 +00:00
|
|
|
int timeSinceLastTopHole = 0;
|
|
|
|
int timeSinceLastBottomHole = 0;
|
2021-09-03 23:29:18 +00:00
|
|
|
Random random = Random();
|
|
|
|
|
|
|
|
Future loadPlatforms() async {
|
2021-09-08 19:27:06 +00:00
|
|
|
l1 = await Flame.images.load('platform-left-nowire-frames.png');
|
|
|
|
l2 = await Flame.images.load('platform-left-wire-frames.png');
|
|
|
|
m1 = await Flame.images.load('platform-mid-nowire-frames.png');
|
|
|
|
m2 = await Flame.images.load('platform-mid-wire-frames.png');
|
|
|
|
r1 = await Flame.images.load('platform-right-nowire-frames.png');
|
|
|
|
r2 = await Flame.images.load('platform-right-wire-frames.png');
|
|
|
|
o1 = await Flame.images.load('platform-single-nowire-frames.png');
|
|
|
|
o2 = await Flame.images.load('platform-single-wire-frames.png');
|
2021-09-05 22:36:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void setUp() {
|
2021-09-11 02:39:32 +00:00
|
|
|
timeSinceLastTopHole = 0;
|
|
|
|
timeSinceLastBottomHole = 0;
|
2021-09-05 22:36:36 +00:00
|
|
|
for (int i = 0; i < platforms.length; i++) {
|
|
|
|
for (int j = 0; j < platforms[i].length; j++) {
|
|
|
|
remove(platforms[i], j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
platforms = [];
|
2021-09-03 23:29:18 +00:00
|
|
|
for (int i = 0; i < 9; i++) {
|
|
|
|
platforms.add([]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-11 02:39:32 +00:00
|
|
|
void generatePlatforms(MyGame gameRef) {
|
|
|
|
while (!generatePlatform(gameRef, 2)) {
|
|
|
|
timeSinceLastTopHole++;
|
|
|
|
}
|
|
|
|
while (!generatePlatform(gameRef, 5)) {
|
|
|
|
timeSinceLastBottomHole++;
|
|
|
|
}
|
|
|
|
|
|
|
|
int topChance =
|
|
|
|
random.nextInt(timeSinceLastTopHole > 0 ? timeSinceLastTopHole : 1);
|
|
|
|
int bottomChance = random
|
|
|
|
.nextInt(timeSinceLastBottomHole > 0 ? timeSinceLastBottomHole : 1);
|
|
|
|
|
|
|
|
if (topChance > 50) {
|
|
|
|
remove(platforms[2], platforms[2].length - 2);
|
|
|
|
remove(platforms[2], platforms[2].length - 2);
|
|
|
|
timeSinceLastTopHole = 0;
|
|
|
|
}
|
|
|
|
if (bottomChance > 30) {
|
|
|
|
Platform start = platforms[5].elementAt(platforms[5].length - 10);
|
|
|
|
generatePlatform(gameRef, 8, xPosition: start.sprite.position.x);
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
|
|
generatePlatform(gameRef, 8);
|
|
|
|
}
|
|
|
|
int lastToRemove = platforms[5].length - 3;
|
|
|
|
int firstToRemove = platforms[5].length - 10;
|
|
|
|
remove(platforms[5], lastToRemove);
|
|
|
|
remove(platforms[5], lastToRemove);
|
|
|
|
remove(platforms[5], firstToRemove);
|
|
|
|
remove(platforms[5], firstToRemove);
|
|
|
|
timeSinceLastBottomHole = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool generatePlatform(MyGame gameRef, int level, {double xPosition = 0}) {
|
|
|
|
double xCoordinate = xPosition;
|
|
|
|
if (platforms[level].isNotEmpty && xPosition == 0) {
|
2021-09-04 22:56:08 +00:00
|
|
|
xCoordinate = platforms[level].last.getRightEnd();
|
2021-09-03 23:29:18 +00:00
|
|
|
}
|
|
|
|
|
2021-09-11 02:39:32 +00:00
|
|
|
if (xCoordinate > gameRef.size.x + 2000) {
|
2021-09-03 23:29:18 +00:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
Platform platform = Platform(gameRef);
|
2021-09-04 22:56:08 +00:00
|
|
|
platform.setPosition(xCoordinate, gameRef.blockSize * level);
|
2021-09-08 19:27:06 +00:00
|
|
|
platform.row = level;
|
2021-09-04 22:56:08 +00:00
|
|
|
gameRef.add(platform.sprite);
|
2021-09-03 23:29:18 +00:00
|
|
|
platforms[level].add(platform);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void update(double dt) {
|
|
|
|
for (List<Platform> platformLevel in platforms) {
|
|
|
|
for (Platform p in platformLevel) {
|
|
|
|
p.update(dt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-05 22:36:36 +00:00
|
|
|
void remove(List<Platform> levelHolder, int j) {
|
|
|
|
levelHolder[j].remove();
|
|
|
|
levelHolder[j].sprite.remove();
|
|
|
|
levelHolder.removeAt(j);
|
|
|
|
}
|
|
|
|
|
2021-09-03 23:29:18 +00:00
|
|
|
void removePast(MyGame gameRef) {
|
|
|
|
for (List<Platform> platformLevel in platforms) {
|
|
|
|
while (platformLevel.isNotEmpty &&
|
|
|
|
platformLevel[0].sprite.position.x + platformLevel[0].sprite.width <
|
|
|
|
0) {
|
2021-09-05 22:36:36 +00:00
|
|
|
remove(platformLevel, 0);
|
2021-09-03 23:29:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-04 04:17:12 +00:00
|
|
|
|
|
|
|
double getFlushX() {
|
|
|
|
Platform platform =
|
|
|
|
platforms[2].firstWhere((element) => element.sprite.x > 0, orElse: () {
|
|
|
|
return platforms[5].firstWhere((element) => element.sprite.x > 0,
|
|
|
|
orElse: () {
|
|
|
|
return platforms[8].firstWhere((element) => element.sprite.x > 0);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
return platform.sprite.x;
|
|
|
|
}
|
2021-09-04 22:56:08 +00:00
|
|
|
|
|
|
|
Platform? getPlatformOffScreen(int level) {
|
|
|
|
for (int i = 0; i < platforms[level].length; i++) {
|
|
|
|
Platform p = platforms[level][i];
|
|
|
|
if (p.sprite.x > p.gameRef.size.x) {
|
|
|
|
int chosenIndex = random.nextInt(platforms[level].length - i) + i;
|
|
|
|
return platforms[level][chosenIndex];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2021-09-03 23:29:18 +00:00
|
|
|
}
|