I'm following the Canyon Bunny example in making my own game and I'm at the point where I want to implement a level selection screen. The way the example code works is that there's a Level
class whose constructor takes a string variable that contains the path of the level file to be loaded from WorldController
class which contains the game logic. So far I have a LevelScreen with the various buttons for the various levels like so:
public class LevelScreen extends AbstractGameScreen {
private Stage stage;
private Skin levelSkin;
private String currLevel;
private Image imgBackground;
private Button btnForest, btnDesert;
private final float DEBUG_REBUILD_INTERVAL = 5.0f;
private boolean debugEnabled = false;
private float debugRebuildStage;
private static final String TAG = LevelScreen.class.getName();
public LevelScreen(DirectedGame game) {
super(game);
}
private void rebuildStage() {
levelSkin = new Skin(Gdx.files.internal(Constants.SKIN_LEVEL_UI),
new TextureAtlas(Constants.TEXTURE_ATLAS_LEVELS));
Table layerBackground = buildBackgroundLayer();
Table layerLevels = buildLevelsLayer();
stage.clear();
Stack stack = new Stack();
stage.addActor(stack);
stack.setSize(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);
stack.add(layerBackground);
stack.add(layerLevels);
}
private Table buildBackgroundLayer() {
Table layer = new Table();
imgBackground = new Image(levelSkin, "wallpaper");
layer.add(imgBackground);
return layer;
}
private Table buildLevelsLayer() {
Table layer = new Table();
btnDesert = new Button(levelSkin, "desert");
layer.addActor(btnDesert);
btnDesert.setPosition(50, 250);
btnDesert.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
onDesertClicked();
}
private void onDesertClicked() {
setCurrLevel(Constants.LEVEL_01);
ScreenTransition transition = ScreenTransitionSlide.init(0.75f, ScreenTransitionSlide.LEFT, false,
Interpolation.bounceOut);
game.setScreen(new GameScreen(game), transition);
}
});
btnForest = new Button(levelSkin, "forest");
layer.addActor(btnForest);
btnForest.setPosition(345, 150);
btnForest.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
onForestClicked();
}
private void onForestClicked() {
setCurrLevel(Constants.LEVEL_02);
ScreenTransition transition = ScreenTransitionSlide.init(0.75f, ScreenTransitionSlide.LEFT, false,
Interpolation.bounceOut);
game.setScreen(new GameScreen(game), transition);
}
});
btnBack = new Button(levelSkin, "back");
layer.addActor(btnBack);
btnBack.setPosition(640, 50);
btnBack.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
onBackClicked();
}
});
return layer;
}
@Override
public InputProcessor getInputProcessor() {
return stage;
}
@Override
public void render(float deltaTime) {
Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if (debugEnabled) {
debugRebuildStage -= deltaTime;
if (debugRebuildStage <= 0) {
debugRebuildStage = DEBUG_REBUILD_INTERVAL;
rebuildStage();
}
}
stage.act(deltaTime);
stage.draw();
Table.drawDebug(stage);
}
private void onBackClicked() {
ScreenTransition transition = ScreenTransitionSlide.init(1, ScreenTransitionSlide.RIGHT, false,
Interpolation.bounceOut);
game.setScreen(new MenuScreen(game), transition);
}
@Override
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
@Override
public void show() {
stage = new Stage(new StretchViewport(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT));
rebuildStage();
}
@Override
public void hide() {
stage.dispose();
levelSkin.dispose();
}
@Override
public void pause() {
}
public String getCurrLevel() {
return currLevel;
}
public void setCurrLevel(String currLevel) {
this.currLevel = currLevel;
}
}
What I'm trying to achieve is for the initLevel()
method in WorldController
to receive currLevel and pass it to Level
as shown
public class WorldController extends InputAdapter {
private static final String TAG = WorldController.class.getName();
public Level level;
public int lives;
public int coinScore, keyScore;
public CameraHelper cameraHelper;
private DirectedGame game;
private LevelScreen levScreen;
private Rectangle r1 = new Rectangle();
private Rectangle r2 = new Rectangle();
public WorldController(DirectedGame game) {
this.game = game;
init();
}
private void init() {
cameraHelper = new CameraHelper();
lives = Constants.LIVES_START;
initLevel();
}
private void initLevel() {
coinScore = 0;
level = new Level(levScreen.getCurrLevel());
cameraHelper.setTarget(level.player);
}
// more code
}
I keep getting a NPE error with this. I'm still new to java and libgdx, what I'd like to know is how I can pass the String containing the path to the level file from LevelSelect
to WorldController
and specifically to this line level = new Level(levScreen.getCurrLevel());
Thanks.