【发布时间】:2020-12-30 19:10:31
【问题描述】:
我是 Libgdx 的初学者,我有一个简单的 Galaga 类型的游戏设置,玩家通过具有不同统计数据的不同级别敌人的波来获得积分。然后玩家可以使用这些点升级某些船舶统计数据。几乎所有事情都已完成,我现在所关注的就是随着玩家的进步,在玩家飞船统计数据和不同敌人统计数据之间平衡游戏玩法。我希望游戏是无限的,因为玩家可以持续下去,但我似乎无法弄清楚如何设置敌人产卵,以便随着玩家的进步,敌人有不同/更难的统计数据还有更多的敌人。
这是我的GameScreen 类中的spawnEnemies 方法,它将EnemyShip 对象添加到一个数组中,该数组被迭代,然后每艘船都在渲染方法中呈现。
public void spawnEnemies(float deltaTime) {
waveTimer += deltaTime; // sets to currentTime
if (waveTimer > timeBetweenWaves) { // if after time between waves
enemySpawnTimer += deltaTime;
if (enemySpawnTimer > timeBetweenEnemySpawns && enemiesSpawned < maxEnemies) { // after enemy spawn timer and only if its less than max enemies
enemyShipList.add(enemyType()); // adds to enemy ship list which is then iterated through and rendered
enemiesSpawned++;
enemySpawnTimer -= timeBetweenEnemySpawns;
}
}
if (enemiesDestroyed == maxEnemies) {
nextWave();
}
}
添加到列表中的船是由这个enemyType方法中的当前波决定的:
private EnemyShip enemyType() {
if (waveCounter >= 1 && waveCounter <= 2) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 25, 2, 2, 0, 34,45,0.8f, Assets.instance.enemyShips.ENEMY_BLACK_01, Assets.instance.lasers.LASER_BLUE_05,6f,.4f);
} else if (waveCounter >= 3 && waveCounter <= 6) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 50, 4, 4, 1, 38,45,0.8f, Assets.instance.enemyShips.ENEMY_BLUE_03, Assets.instance.lasers.LASER_RED_05, 6f, .4f);
}else if (waveCounter >= 7 && waveCounter <= 10) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 75, 4, 5, 1, 42,50,0.8f, Assets.instance.enemyShips.ENEMY_BLACK_02, Assets.instance.lasers.LASER_BLUE_04, 6f, .4f);
}else if (waveCounter >= 11 && waveCounter <= 14) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 100, 6, 6, 2, 45,54,0.7f, Assets.instance.enemyShips.ENEMY_GREEN_03, Assets.instance.lasers.LASER_BLUE_05, 6f, .4f);
}else if (waveCounter >= 15 && waveCounter <= 18) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 125, 6, 6, 2, 48,58,0.7f, Assets.instance.enemyShips.ENEMY_RED_04, Assets.instance.lasers.LASER_GREEN_03, 6f, .4f);
}else if (waveCounter >= 19 && waveCounter <= 24) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 125, 8, 7, 3, 50,60,0.7f, Assets.instance.enemyShips.ENEMY_GREEN_04, Assets.instance.lasers.LASER_RED_03, 6f, .4f);
}
else if (waveCounter >= 25 && waveCounter <= 28){
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 125, 8, 8, 3, 50,60,0.7f, Assets.instance.enemyShips.ENEMY_BLACK_02, Assets.instance.lasers.LASER_RED_05,6f,.4f);
}else if (waveCounter >= 29 && waveCounter <= 32) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 150, 8, 9, 3, 50,60,0.7f, Assets.instance.enemyShips.ENEMY_BLACK_04, Assets.instance.lasers.LASER_GREEN_13, 6f, .4f);
}else if (waveCounter >= 33 && waveCounter <= 35) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 150, 9, 10, 4, 54,64,0.6f, Assets.instance.enemyShips.ENEMY_RED_02, Assets.instance.lasers.LASER_BLUE_12, 6f, .4f);
}else if (waveCounter >= 36 && waveCounter <= 39) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 175, 9, 12, 4, 58,65,0.6f, Assets.instance.enemyShips.ENEMY_BLACK_05, Assets.instance.lasers.LASER_BLUE_10, 6f, .4f);
}else if (waveCounter >= 40 && waveCounter <= 45) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 175, 10, 12, 5, 60,68,0.6f, Assets.instance.enemyShips.ENEMY_GREEN_05, Assets.instance.lasers.LASER_RED_03, 6f, .4f);
}else if (waveCounter >= 6 && waveCounter <= 49) {
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 200, 12, 14, 5, 64,70,0.5f, Assets.instance.enemyShips.ENEMY_RED_05, Assets.instance.lasers.LASER_GREEN_12, 6f, .4f);
}
return new EnemyShip(StarshooterGame.random.nextFloat() * (WORLD_WIDTH - 10) + 5, WORLD_HEIGHT - 5, 220, 14, 1, 0, 68,80,0.1f, Assets.instance.enemyShips.ENEMY_BLUE_05, Assets.instance.lasers.LASER_BLUE_05, 6f, .4f);
}
我之前有单独的 EnemyShip 子类(即 level01Enemy、level02Enemy),但后来将其更改为父类 EnemyShip,因为我认为单独的类没有意义,因为我只是更改了统计信息和船/激光纹理区域。然后我对每个数据进行硬编码。这是一个临时解决方案,但我想编写干净的代码,而不必硬编码所有统计信息。如果我必须改变我的整个方法或者我的代码很糟糕,请告诉我,因为正如我所说,我是初学者。
【问题讨论】:
标签: java random libgdx spawning