Add positional parameter to LevelConfig.
This commit is contained in:
parent
eeb2a9c875
commit
1c80a8745a
|
@ -3,13 +3,25 @@ name:Testlevel \o/
|
||||||
backgroundMusic:music/ScooterFriendsTurbo8Bit.wav
|
backgroundMusic:music/ScooterFriendsTurbo8Bit.wav
|
||||||
background:CloudBackground
|
background:CloudBackground
|
||||||
-
|
-
|
||||||
[0-4]
|
[0-2]
|
||||||
spawn:EnemyOne,1,5
|
spawn:StoneOne,2,1,0
|
||||||
spawn:StoneOne,4,5
|
spawn:StoneOne,2,1,10
|
||||||
|
spawn:StoneOne,2,1,20
|
||||||
|
spawn:StoneOne,2,1,30
|
||||||
|
spawn:StoneOne,2,1,40
|
||||||
|
spawn:EnemyOne,2,1,50
|
||||||
|
spawn:StoneOne,2,1,60
|
||||||
|
spawn:StoneOne,2,1,70
|
||||||
|
spawn:StoneOne,2,1,80
|
||||||
|
spawn:StoneOne,2,1,90
|
||||||
|
spawn:StoneOne,2,1,100
|
||||||
|
[2-4]
|
||||||
|
spawn:EnemyOne,1,5,20
|
||||||
|
spawn:StoneOne,4,5,50
|
||||||
[4-10]
|
[4-10]
|
||||||
spawn:EnemyTwo,1,10
|
spawn:EnemyTwo,1,10,60
|
||||||
[10-25]
|
[10-25]
|
||||||
spawn:EnemyThree,2,4
|
spawn:EnemyThree,2,4,33
|
||||||
spawn:EnemyTwo,5,6
|
spawn:EnemyTwo,5,6,10
|
||||||
[25-30]
|
[25-30]
|
||||||
spawn:EnemyBoss,1,1
|
spawn:EnemyBoss,1,1,100
|
||||||
|
|
|
@ -8,7 +8,7 @@ public class GameConfig {
|
||||||
/**
|
/**
|
||||||
* Whether debug output (and more) is enabled or disabled.
|
* Whether debug output (and more) is enabled or disabled.
|
||||||
*/
|
*/
|
||||||
public static boolean DEBUG = false;
|
public static final boolean DEBUG = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Width of GameWindow.
|
* Width of GameWindow.
|
||||||
|
|
|
@ -20,6 +20,7 @@ public class EnemyOne extends Enemy {
|
||||||
@Override
|
@Override
|
||||||
public void update() {
|
public void update() {
|
||||||
super.update();
|
super.update();
|
||||||
|
this.transpose(-1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,7 +14,6 @@ import de.teamteamteam.spacescooter.entity.obstacle.StoneOne;
|
||||||
import de.teamteamteam.spacescooter.screen.GameScreen;
|
import de.teamteamteam.spacescooter.screen.GameScreen;
|
||||||
import de.teamteamteam.spacescooter.sound.SoundSystem;
|
import de.teamteamteam.spacescooter.sound.SoundSystem;
|
||||||
import de.teamteamteam.spacescooter.utility.Loader;
|
import de.teamteamteam.spacescooter.utility.Loader;
|
||||||
import de.teamteamteam.spacescooter.utility.Random;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of the actual level based gameplay logic.
|
* Implementation of the actual level based gameplay logic.
|
||||||
|
@ -52,6 +51,26 @@ public final class Level {
|
||||||
* that the game is over (meaning isGameOver() returning true).
|
* that the game is over (meaning isGameOver() returning true).
|
||||||
*/
|
*/
|
||||||
private int gameOverDelay;
|
private int gameOverDelay;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offset for game screen 0 coordinate on X axis.
|
||||||
|
*/
|
||||||
|
private int gameScreenXOffset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offset for game screen 0 coordinate on Y axis.
|
||||||
|
*/
|
||||||
|
private int gameScreenYOffset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actual width of game screen.
|
||||||
|
*/
|
||||||
|
private int gameScreenWidth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Actual height of game screen.
|
||||||
|
*/
|
||||||
|
private int gameScreenHeight;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor creating a LevelConfig based on a given config file.
|
* Constructor creating a LevelConfig based on a given config file.
|
||||||
|
@ -61,6 +80,12 @@ public final class Level {
|
||||||
this.isGameOver = false;
|
this.isGameOver = false;
|
||||||
this.gameOverDelay = 3;
|
this.gameOverDelay = 3;
|
||||||
this.config = Loader.getLevelConfigByFilename(levelConfig);
|
this.config = Loader.getLevelConfigByFilename(levelConfig);
|
||||||
|
|
||||||
|
//TODO: Put this into the GameConfig!
|
||||||
|
this.gameScreenXOffset = 0;
|
||||||
|
this.gameScreenYOffset = 50;
|
||||||
|
this.gameScreenWidth = GameConfig.windowWidth - 1; //This is fine.
|
||||||
|
this.gameScreenHeight = GameConfig.windowHeight - 51; //TODO: NOT HARDCODE THIS :/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,19 +120,20 @@ public final class Level {
|
||||||
* - 1: EntityNumber - This helps to find out what Entity to actually spawn.
|
* - 1: EntityNumber - This helps to find out what Entity to actually spawn.
|
||||||
* - 2: Amount - The amount of Entities to spawn at a time.
|
* - 2: Amount - The amount of Entities to spawn at a time.
|
||||||
* - 3: SpawnRate - The rate at which the Entities are supposed to be spawned.
|
* - 3: SpawnRate - The rate at which the Entities are supposed to be spawned.
|
||||||
|
* - 4: SpawnPosition - percentage of GameConfig.windowHeight - Where the Enemy shall spawn.
|
||||||
*/
|
*/
|
||||||
for(int[] spawnrule : this.config.spawnRuleList) {
|
for(int[] spawnRule : this.config.spawnRuleList) {
|
||||||
//Skip spawn rules that are not in the current spawn interval.
|
//Skip spawn rules that are not in the current spawn interval.
|
||||||
if(spawnrule[0] != currentIntervalIndex) continue;
|
if(spawnRule[0] != currentIntervalIndex) continue;
|
||||||
//Divide the current interval by spawnrate
|
//Divide the current interval by spawnrate
|
||||||
int intervalModulus = intervalLength / spawnrule[3];
|
int intervalModulus = intervalLength / spawnRule[3];
|
||||||
//Check whether the spawn rate strikes right now.
|
//Check whether the spawn rate strikes right now.
|
||||||
if(relativeTimeWithinCurrentInterval % Math.max(1,intervalModulus) == 0) {
|
if(relativeTimeWithinCurrentInterval % Math.max(1,intervalModulus) == 0) {
|
||||||
//If the rule matches the current time, spawn the configured Entity in the configured amount:
|
//If the rule matches the current time, spawn the configured Entity in the configured amount:
|
||||||
for(int i=0; i<spawnrule[2]; i++) {
|
for(int i=0; i<spawnRule[2]; i++) {
|
||||||
//TODO: More beautiful positions!
|
int x = this.gameScreenWidth + this.gameScreenXOffset - 1;
|
||||||
//ToDo: X is GameConfig.windowWidth - somePixels, should be the whole width (for enemies coming into the screen from the right).
|
int y = Math.round((this.gameScreenHeight * spawnRule[4]) / 100) + this.gameScreenYOffset - 1;
|
||||||
this.spawnEntityByAvailableName(Entity.availableNames.values()[spawnrule[1]], GameConfig.windowWidth - 50, Random.nextInt(GameConfig.windowHeight -50)+50);
|
this.spawnEntityByAvailableName(Entity.availableNames.values()[spawnRule[1]], x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ public class LevelConfig {
|
||||||
* - 1: EntityNumber - This helps to find out what Entity to actually spawn.
|
* - 1: EntityNumber - This helps to find out what Entity to actually spawn.
|
||||||
* - 2: Amount - The amount of Entities to spawn at a time.
|
* - 2: Amount - The amount of Entities to spawn at a time.
|
||||||
* - 3: SpawnRate - The rate at which the Entities are supposed to be spawned.
|
* - 3: SpawnRate - The rate at which the Entities are supposed to be spawned.
|
||||||
|
* - 4: SpawnPosition - percentage of GameConfig.windowHeight - Where the Enemy shall spawn.
|
||||||
*/
|
*/
|
||||||
public List<int[]> spawnRuleList;
|
public List<int[]> spawnRuleList;
|
||||||
|
|
||||||
|
@ -119,13 +120,16 @@ public class LevelConfig {
|
||||||
/**
|
/**
|
||||||
* Add a given EntitySpawnRule to the ruleList.
|
* Add a given EntitySpawnRule to the ruleList.
|
||||||
*/
|
*/
|
||||||
public void addEntitySpawnRule(int intervalStart, int intervalEnd, String entityName, int amount, int spawnRate) {
|
public void addEntitySpawnRule(int intervalStart, int intervalEnd, String entityName, int amount, int spawnRate, int spawnPositionPercentage) {
|
||||||
int intervalIndex = this.getIntervalIndexByBorders(intervalStart, intervalEnd);
|
int intervalIndex = this.getIntervalIndexByBorders(intervalStart, intervalEnd);
|
||||||
if(intervalIndex == -1) {
|
if(intervalIndex == -1) {
|
||||||
throw new LevelConfigException("No Interval for rule found!\nRule: " + intervalStart + " to " + intervalEnd + ": " + entityName + ", " + amount + ", " + spawnRate);
|
throw new LevelConfigException("No Interval for rule found!\nRule: " + intervalStart + " to " + intervalEnd + ": " + entityName + ", " + amount + ", " + spawnRate + ", " + spawnPositionPercentage);
|
||||||
} else {
|
} else {
|
||||||
int enemyNumber = Entity.availableNames.valueOf(entityName).ordinal();
|
int enemyNumber = Entity.availableNames.valueOf(entityName).ordinal();
|
||||||
int[] newRule = {intervalIndex, enemyNumber, amount, spawnRate};
|
if(spawnPositionPercentage < 0 || spawnPositionPercentage > 100) {
|
||||||
|
throw new LevelConfigException("Invalid spawnPosition percentage!\nRule: " + intervalStart + " to " + intervalEnd + ": " + entityName + ", " + amount + ", " + spawnRate + ", " + spawnPositionPercentage);
|
||||||
|
}
|
||||||
|
int[] newRule = {intervalIndex, enemyNumber, amount, spawnRate, spawnPositionPercentage};
|
||||||
this.spawnRuleList.add(newRule);
|
this.spawnRuleList.add(newRule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,8 +86,15 @@ public class LevelConfigParser {
|
||||||
} else {
|
} else {
|
||||||
String[] rule = line.split(":", 2);
|
String[] rule = line.split(":", 2);
|
||||||
if(rule[0].equals("spawn")) {
|
if(rule[0].equals("spawn")) {
|
||||||
String[] entitySpawnRule = rule[1].split(",", 3);
|
String[] entitySpawnRule = rule[1].split(",", 4);
|
||||||
this.levelConfig.addEntitySpawnRule(this.currentIntervalStart, this.currentIntervalEnd, entitySpawnRule[0], Integer.parseInt(entitySpawnRule[1]), Integer.parseInt(entitySpawnRule[2]));
|
this.levelConfig.addEntitySpawnRule(
|
||||||
|
this.currentIntervalStart,
|
||||||
|
this.currentIntervalEnd,
|
||||||
|
entitySpawnRule[0],
|
||||||
|
Integer.parseInt(entitySpawnRule[1]),
|
||||||
|
Integer.parseInt(entitySpawnRule[2]),
|
||||||
|
Integer.parseInt(entitySpawnRule[3])
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
throw new LevelConfigException("Unknown rule type: '"+rule[0]+"' : '"+line+"'");
|
throw new LevelConfigException("Unknown rule type: '"+rule[0]+"' : '"+line+"'");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue