@opherv / Jul 2016
Hi! I'm Opher
I work with developers, designers and video makers to create some pretty cool experiences
I'm a creative developer at Interlude
What are we doing today?
-
a game using Phaser and Firebase
-
entirely in JS
-
Serverless (kinda)
-
Crowd participation is mandatory (but fun)
-
You will need your phone, make sure you're connected to the wifi:
CodeNode/ welovecode
Phaser.io
"Desktop and Mobile HTML5 Game Framework:
A fast, free and fun open source framework for Canvas and WebGL powered browser games"
Firebase
Backend as a service
Realtime client updates / JS API
The rules
-
Two Screens: Desktop and Mobile
-
The gameboard consists of a X by X grid
-
Each player controls one commando
The rules
-
Commandos can move one square in any direction
-
When a commando touches another commando, he kills him and stops moving
-
A dead commando leaves his underwear in the square where he died
-
Commandos can't walk on squares with underwear
Typical multiplayer game architecture
Yeah... we're not going to do any of that
Desktop
Clients
Firebase
Game State is saved on desktop instance
Clients send their requests to firebase
Desktop consumes requests and updates game world
Desktop
Clients
Firebase
Our architecture kind of sucks
(for large scale projects)
It doesn't deal with:
- Input validation
- Lag handling (IE prediction / interpolation)
- Conflict resolution
...but it works! and it's cool!
and I only have 30 mins.
Building the client
That's not all!
More work to be done:
- Saving the game state
- Registering different players
- Implementing player collision
Saving the game state
var gameBoard = new Array();
for (var x=0; x< gridSize; x++){
gameBoard.push(new Array());
for (var y=0; y< gridSize; y++){
gameBoard[x][y] = "empty";
}
}
//moving a commando: checking the game state
function moveCommando(commando, x, y){
//hit game edge
if (x<0 || x>=gridSize || y<0 || y>=gridSize){ return; }
//hit an enemy
if (typeof gameBoard[x][y] == "object"){
killCommando(commando,gameBoard[x][y]);
return;
}
...
}
Adding players - client
var playersRef = new Firebase('https://goingcommando.firebaseio.com/players');
var newPlayerRef = playersRef.push();
newPlayerRef.set({
color: playerColor,
id: newPlayerRef.key()
});
Adding players - server
var playersRef = new Firebase('https://goingcommando.firebaseio.com/players');
playersRef.remove();
playersRef.on('child_added', function(snapshot) {
var newCommando = snapshot.val();
makeNewCommando(newCommando.id, newCommando.color);
});
function makeNewCommando(id, color){
var gridPosition = {
x: Math.floor(Math.random() * gridSize),
y: Math.floor(Math.random() * gridSize)
}
var commando = game.add.sprite(gridPosition.x * squareSize,
gridPosition.y * squareSize,
'commando');
commando.width = squareSize;
commando.height = squareSize;
commando.gridPosition = gridPosition;
commando.id = id;
gameBoard[gridPosition.x][gridPosition.y] = commando;
commando.color = color;
players[commando.id] = commando; //add commando to player array
};
Note on using Firebase for games
don't forget:
YOU NEED TO USE PROPER AUTHENTICATION
It's a less ideal for low latency games:
physics, action, shooters
(Rocket League, World of Warcraft, Call of Duty)
Firebase is a good match for medium to high latency games:
turn based, discrete movement, strategy, puzzle
(Chess, Hearthstone, Clash of Clans)
Thanks!
@OpherV
opherv.com
github.com/opherv
none of your business
Going Commando
By Opher Vishnia
Going Commando
- 1,949