| A New Level |
As is often the case with me, I work on these games late at night and usually only for an hour or so, and I don't think of what is later the obvious solution until I've been away from it for a while. Over the weekend, I came to the conclusion that I should only be using a single State for all the different levels and merely changing which map gets loaded by other means.
Here are those other means... First, I created some simple objects which contain the map and music asset keys for each level. I put them all in a map inside an object I called gameState. This is different from a Phaser State object - I use it to keep track of my own personal state information. So far, that means which map is being played and what background music to use. I pass this gameState object to the constructors for both the stage select and the playable stage.
var sandboxLevel = {
map: "LevelSandbox",
music: "Ouroboros"
};
var levelOne = {
map: "Level1",
music: "DangerStorm"
};
var gameState = {
levels: [],
currentLevel: "sb"
};
gameState.levels["sb"] = sandboxLevel;
gameState.levels["one"] = levelOne;
var theStage = stage(gameState);
var stageSelectState = selectStage(gameState);
var game = new Phaser.Game(width, height, Phaser.CANVAS, "gameArea");
game.state.add("stageSelect", stageSelectState, true);
game.state.add("level", theStage);
As you can see in my code snippets above, I now only have to add two States to the Game. Inside the update function for the stage select state, I simply manipulate my gameState object before switching the Phaser State to the playable level.
function update() {
if (keys.s.isDown) {
// sandbox level is selected...
gameState.currentLevel = "sb";
this.state.start("level");
} else if (keys.o.isDown) {
// level one is selected...
gameState.currentLevel = "one";
this.state.start("level");
}
}
Once a new State is started, the create function gets called on it. In my create function, I use the gameState object to get the current level's map and background music.
function create() {
mapKey = gameState.levels[gameState.currentLevel].map;
musicKey = gameState.levels[gameState.currentLevel].music;
// ... other stuff ...
var map = this.add.tilemap(mapKey);
var bgmusic = this.sound.add(musicKey);
// ... other stuff ...
}
That's it. I like this much better than that first attempt. It should be trivial now to add as many stages as I want. I really only want 8. But anyway...
You can play the game at http://amphibian.com/eight-bit and you can view the complete source code on GitHub. Take a look at today's comic before you go. I brought back Science Frog doing tech support for the other frogs, because it's funny.
![]() |
| Amphibian.com comic for 28 December 2015 |

No comments:
Post a Comment