I didn’t expect to be posting again for a few days, but it turns out smooshing the procedural level generation algorithm into the LibGDX project was really straightforward, so I figured I might as well post a little something about it today
I added the Level class that I posted previously, and just made a few little changes to it:
- I changed char[][] to int[][], no real reason for this, either would be fine
- I pulled in Bobo and Array<Block> from GameScreen
- I replaced the console print method with a method to translate levelLayout to blocks placed in the level
- Finally, a constructor pulls all this together to allow easy creation of a level with a Bobo in it
I could have included block creation in the generateLayout method (under the “levelLayout[row][col] = ’0′;” line) and left out the translateLayout method completely, but separating out layout generation and translation to world co-ordinates seemed like a good idea.
Here’s the full source for Level.java
package com.mrdt.runboborun;
import java.util.Random;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
public class Level {
private Bobo bobo;
private Array blocks;
private Random randomGenerator = new Random();
private int levelHeight, levelWidth, pathWidth, pathOffset;
private int[][] levelLayout;
public Level(int levelHeight, int levelWidth, int pathWidth, int pathOffset) {
blocks = new Array();
generateLayout(levelHeight, levelWidth, pathWidth, pathOffset);
translateLayout();
bobo = new Bobo(new Vector2((GameScreen.WIDTH/2)-(Bobo.WIDTH/2), 0));
}
private void generateLayout(int levelHeight, int levelWidth, int pathWidth, int pathOffset) {
this.levelHeight = levelHeight;
this.levelWidth = levelWidth;
this.pathWidth = pathWidth;
this.pathOffset = pathOffset;
this.levelLayout = new int[levelHeight][levelWidth];
for (int row=0; row<levelLayout.length; row++) {
for (int col=0; col<levelLayout[row].length; col++) {
if ((col < pathOffset) || (col >= pathOffset+pathWidth))
levelLayout[row][col] = '0';
}
int stepModifier = (randomGenerator.nextInt(3)) - 1;
if ((pathOffset + stepModifier >= 0) && (pathOffset + stepModifier + pathWidth <= levelWidth))
pathOffset = pathOffset + stepModifier;
}
}
private void translateLayout() {
for (int row=0; row<levelLayout.length; row++) {
for (int col=0; col<levelLayout[row].length; col++) {
if (levelLayout[row][col] == '0') {
Block block = new Block(new Vector2(col*Block.WIDTH, -row*Block.HEIGHT));
blocks.add(block);
}
}
}
}
public Bobo getBobo() {
return bobo;
}
public Array getBlocks() {
return blocks;
}
}
As a result of introducing the Level class, the GameScreen class needed a little tidying up.
Project is up on github, feel free to check the project out, have a play with it, and comment if you have any ideas or suggestions :)
No comments:
Post a Comment