Talking about Sokoban game, 3D, Game development and Javascript.
I already talked about Buildbox and its #nocode hashtag, but since I am basically against building stuff with no code and at the same time I love Buildbox, I created a 3D Sokoban prototype using almost no code by simply using my pure JavaScript Sokoban class.
No playable example to show since Buildbox does not support HTML5, but it’s inner engine accepts JavaScript, so here is a video of the game:
Level is built at runtime by the script, and the only object I physically added to the world is the ground:
The script was added as a node to the ground, and only consists in a few lines, with the whole game logic managed by my class:
let sokoban;
let level = "########\n#####@.#\n####.$$#\n#### $ #\n### .# #\n### #\n### ###\n########";
function init(){
sokoban = new Sokoban();
sokoban.buildLevelFromString(level);
let floors = sokoban.getFloors();
floors.forEach(function(floor){
createItem(floor, "Floor", this.scene(), -4.5);
}.bind(this));
let crates = sokoban.getCrates();
crates.forEach(function(crate){
createItem(crate, "Crate", this.scene(), 2.5);
}.bind(this));
let goals = sokoban.getGoals();
goals.forEach(function(goal){
createItem(goal, "Goal", this.scene(), 1);
}.bind(this));
let player = sokoban.getPlayer();
createItem(player, "Player", this.scene(), 2.5);
}
function createItem(item, entityString, scene, posY){
let entity = scene.create(entityString);
entity.setPosition(-14 + item.getColumn() * 4, posY, -14 + item.getRow() * 4);
item.setData(entity);
}
function signal(name, value){
if(value){
let move;
switch(name){
case "Up":
move = sokoban.moveUp();
break;
case "Down":
move = sokoban.moveDown();
break;
case "Left":
move = sokoban.moveLeft();
break;
case "Right":
move = sokoban.moveRight();
break;
}
if(move){
handleMovement(sokoban.getPlayer());
let crates = sokoban.getCrates();
crates.forEach(function(crate){
handleMovement(crate);
});
}
}
}
function handleMovement(item){
let deltaRow = item.getRow() - item.getPrevRow();
let deltaColumn = item.getColumn() - item.getPrevColumn();
if(deltaRow != 0 || deltaColumn !=0){
let movement = deltaRow == 0 ? (deltaColumn == 1 ? "RIGHT" : "LEFT") : (deltaRow == 1 ? "DOWN" : "UP")
let entity = item.getData();
entity.component("Movement Script").emitSignal(movement, 1);
}
}
I will add more comments and screenshots about the way nodes have been created inside the project, what I wanted to show you today is I was able to build a game like Sokoban with almost no code with Buildbox.
You can download the entire project, and you will also find the class inside.
Do you like Buildbox + code?
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.