Initial version source code
This commit is contained in:
parent
ea73d0303b
commit
e82e8c859d
4 changed files with 359 additions and 0 deletions
25
index.html
Normal file
25
index.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>MyGame</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script type="text/javascript" src="js/phaser/phaser.min.js"></script>
|
||||
<script src="/eureca.js"></script>
|
||||
<script type="text/javascript" src="js/game.js">
|
||||
|
||||
</script>
|
||||
|
||||
<a href="http://www.wtfpl.net/"><img
|
||||
src="http://www.wtfpl.net/wp-content/uploads/2012/12/wtfpl-badge-4.png"
|
||||
width="80" height="15" alt="WTFPL" /></a>
|
||||
|
||||
</body>
|
||||
</html>
|
239
js/game.js
Normal file
239
js/game.js
Normal file
|
@ -0,0 +1,239 @@
|
|||
// If we're ready
|
||||
var ready = false;
|
||||
|
||||
// My ID
|
||||
var myId;
|
||||
|
||||
// List of other players
|
||||
var playerList = {};
|
||||
|
||||
// Set up the eureca server
|
||||
var eurecaServer;
|
||||
|
||||
// Client setup function
|
||||
var eurecaClientSetup = function() {
|
||||
|
||||
// create an instance of eureca.io client
|
||||
var eurecaClient = new Eureca.Client();
|
||||
|
||||
// Ready function for getting the server
|
||||
eurecaClient.ready(function(proxy) {
|
||||
eurecaServer = proxy;
|
||||
});
|
||||
|
||||
// export functions can be called on the server side
|
||||
|
||||
// Handshake function to hand over ID
|
||||
eurecaClient.exports.handshake = function(id) {
|
||||
//create() is moved here to make sure nothing is created before uniq id assignation
|
||||
myId = id;
|
||||
create();
|
||||
|
||||
state = {
|
||||
x: player.sprite.x,
|
||||
y: player.sprite.y
|
||||
}
|
||||
eurecaServer.updateMe(state);
|
||||
|
||||
ready = true;
|
||||
}
|
||||
|
||||
// close a connection
|
||||
eurecaClient.exports.kill = function(id) {
|
||||
var pl = playerList[id];
|
||||
// if we have this player
|
||||
if (pl) {
|
||||
|
||||
// Kill the player and log
|
||||
pl.kill();
|
||||
console.log(id, " disconnected ", pl);
|
||||
}
|
||||
}
|
||||
|
||||
// Spawn another player
|
||||
eurecaClient.exports.spawnPlayer = function(i, x, y) {
|
||||
|
||||
if (i == myId) return; // do nothing for me
|
||||
|
||||
// log and create the player
|
||||
console.log(i, " connected");
|
||||
var player = new Player(i, x, y);
|
||||
|
||||
// add to our list
|
||||
playerList[i] = player;
|
||||
}
|
||||
|
||||
// Update a player state
|
||||
eurecaClient.exports.updateState = function(id, state) {
|
||||
var pl = playerList[id];
|
||||
|
||||
// if we have this player update it's pos
|
||||
if (pl) {
|
||||
pl.sprite.x = state.x;
|
||||
pl.sprite.y = state.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create the game
|
||||
var game = new Phaser.Game(600, 400,
|
||||
Phaser.AUTO,
|
||||
'', {
|
||||
preload: preload,
|
||||
create: eurecaClientSetup,
|
||||
update: update
|
||||
});
|
||||
|
||||
|
||||
// get the length of a vector
|
||||
function length(vec) {
|
||||
return Math.sqrt((vec.x * vec.x) + (vec.y * vec.y));
|
||||
}
|
||||
|
||||
// Normalise a vector
|
||||
function normalise(vec) {
|
||||
var len = length(vec);
|
||||
vec.x = (vec.x / len);
|
||||
vec.y = (vec.y / len);
|
||||
}
|
||||
|
||||
// Player object
|
||||
Player = function(id, x, y) {
|
||||
|
||||
// Constants
|
||||
this.id = id;
|
||||
this.topSpeed = 5;
|
||||
this.acceleration = 1.5;
|
||||
this.friction = 0.6;
|
||||
this.alive = false;
|
||||
|
||||
// varying
|
||||
this.velocity = {
|
||||
x: 0,
|
||||
y: 0
|
||||
};
|
||||
|
||||
// Create a sprite
|
||||
this.sprite = game.add.sprite(x, y, 'dude');
|
||||
this.sprite.frame = 4;
|
||||
|
||||
// set alive
|
||||
this.alive = true;
|
||||
}
|
||||
|
||||
// Update a player
|
||||
Player.prototype.update = function() {
|
||||
|
||||
// early out if dead
|
||||
if (!this.alive) return;
|
||||
|
||||
// control force
|
||||
var force = {
|
||||
x: 0,
|
||||
y: 0
|
||||
}
|
||||
|
||||
// Grab the members, javascript is weird?
|
||||
var sprite = this.sprite;
|
||||
var velocity = this.velocity;
|
||||
var topSpeed = this.topSpeed;
|
||||
var acceleration = this.acceleration;
|
||||
var friction = this.friction;
|
||||
|
||||
// Left and right
|
||||
if (controls.left.isDown) {
|
||||
// Move to the left
|
||||
force.x = -acceleration;
|
||||
} else if (controls.right.isDown) {
|
||||
// Move to the right
|
||||
force.x = acceleration;
|
||||
}
|
||||
|
||||
// Up and down
|
||||
if (controls.up.isDown) {
|
||||
// Move up
|
||||
force.y = -acceleration;
|
||||
} else if (controls.down.isDown) {
|
||||
// Move down
|
||||
force.y = acceleration;
|
||||
}
|
||||
|
||||
// Normalise out force
|
||||
if (length(force) > 0) {
|
||||
normalise(force)
|
||||
|
||||
// Limit to pos
|
||||
velocity.x = Math.min(velocity.x + force.x, topSpeed);
|
||||
velocity.y = Math.min(velocity.y + force.y, topSpeed);
|
||||
|
||||
// Limit to neg
|
||||
velocity.x = Math.max(velocity.x + force.x, -topSpeed);
|
||||
velocity.y = Math.max(velocity.y + force.y, -topSpeed);
|
||||
|
||||
} else {
|
||||
|
||||
// if no force, then apply friction
|
||||
velocity.x = velocity.x * friction;
|
||||
velocity.y = velocity.y * friction;
|
||||
}
|
||||
|
||||
// if we have a speed, then update pos and send info to server
|
||||
if (length(velocity) > 1) {
|
||||
|
||||
sprite.position.x = sprite.position.x + velocity.x;
|
||||
sprite.position.y = sprite.position.y + velocity.y;
|
||||
|
||||
var state = {
|
||||
x: sprite.position.x,
|
||||
y: sprite.position.y
|
||||
}
|
||||
eurecaServer.updateMe(state)
|
||||
}
|
||||
}
|
||||
|
||||
// Kill a player
|
||||
Player.prototype.kill = function() {
|
||||
// The player and its settings
|
||||
this.sprite.kill();
|
||||
this.alive = false;
|
||||
}
|
||||
|
||||
// Phaser functions
|
||||
|
||||
// preload all assets
|
||||
function preload() {
|
||||
|
||||
// Set centered
|
||||
game.scale.pageAlignHorizontally = true;
|
||||
game.scale.pageAlignVertically = true;
|
||||
|
||||
// load the background
|
||||
game.load.image("bg", "assets/bg.jpg");
|
||||
|
||||
// Load the dude
|
||||
game.load.spritesheet('dude', 'assets/dude.png', 32, 48);
|
||||
}
|
||||
|
||||
// Create the game
|
||||
function create() {
|
||||
|
||||
// Add the background sprite
|
||||
background = game.add.sprite(0, 0, "bg");
|
||||
|
||||
// create our player
|
||||
player = new Player(myId, Math.random() * 100, Math.random() * 100);
|
||||
|
||||
// Get controls
|
||||
controls = game.input.keyboard.createCursorKeys();
|
||||
}
|
||||
|
||||
// On update
|
||||
function update() {
|
||||
|
||||
// do nothing if not ready yet
|
||||
if (!ready) return;
|
||||
|
||||
// update our player
|
||||
player.update();
|
||||
|
||||
}
|
0
js/player.js
Normal file
0
js/player.js
Normal file
95
server.js
Normal file
95
server.js
Normal file
|
@ -0,0 +1,95 @@
|
|||
// Setup:
|
||||
// npm install express
|
||||
// npm install engine.io
|
||||
// npm install eureca.io
|
||||
|
||||
// Pull in express
|
||||
var express = require('express');
|
||||
|
||||
// Our app and server objects
|
||||
var app = express(app);
|
||||
var server = require('http').createServer(app);
|
||||
|
||||
// serve static files from the current directory
|
||||
app.use(express.static(__dirname));
|
||||
|
||||
// get a eureca server
|
||||
var EurecaServer = require('eureca.io').EurecaServer;
|
||||
|
||||
//create an instance of EurecaServer
|
||||
var eurecaServer = new EurecaServer({
|
||||
// Allow out communication functions
|
||||
allow: ['handshake', 'spawnPlayer', 'kill', 'updateState']
|
||||
});
|
||||
|
||||
// attach eurica to our server
|
||||
eurecaServer.attach(server);
|
||||
|
||||
// Our list of clients
|
||||
var clients = {};
|
||||
|
||||
// When a client connects
|
||||
eurecaServer.onConnect(function(conn) {
|
||||
|
||||
console.log('Connection %s from ', conn.id, conn.remoteAddress);
|
||||
|
||||
// Grab the client proxy to call functions easily
|
||||
var remote = eurecaServer.getClient(conn.id);
|
||||
|
||||
// Handshake with the client sending it it's new ID
|
||||
remote.handshake(conn.id);
|
||||
|
||||
// Inform the client of all other players to spawn
|
||||
for (var c in clients) {
|
||||
var x = clients[c].state ? clients[c].state.x : 0;
|
||||
var y = clients[c].state ? clients[c].state.y : 0;
|
||||
|
||||
remote.spawnPlayer(clients[c].id, x, y);
|
||||
}
|
||||
|
||||
// Inform other clients to spawn this player
|
||||
for (var c in clients) {
|
||||
var x = remote.state ? remote.state.x : 0;
|
||||
var y = remote.state ? remote.state.y : 0;
|
||||
|
||||
clients[c].remote.spawnPlayer(conn.id, x, y);
|
||||
}
|
||||
|
||||
// Add the client to our list
|
||||
clients[conn.id] = {
|
||||
id: conn.id,
|
||||
remote: remote,
|
||||
}
|
||||
});
|
||||
|
||||
// When a client disconnects
|
||||
eurecaServer.onDisconnect(function(conn) {
|
||||
|
||||
console.log('Disconnection ', conn.id);
|
||||
|
||||
// delete this client
|
||||
delete clients[conn.id];
|
||||
|
||||
// Notify other clients of disconnection
|
||||
for (var c in clients) {
|
||||
clients[c].remote.kill(conn.id);
|
||||
}
|
||||
});
|
||||
|
||||
// When a client asks to update it's state
|
||||
eurecaServer.exports.updateMe = function(state) {
|
||||
|
||||
// Get conncection info
|
||||
var conn = this.connection;
|
||||
|
||||
// Send new state to all other clients
|
||||
for (var c in clients) {
|
||||
clients[c].remote.updateState(conn.id, state);
|
||||
}
|
||||
|
||||
// store the last known state
|
||||
clients[conn.id].state = state;
|
||||
}
|
||||
|
||||
// Listen on port 80
|
||||
server.listen(8000);
|
Loading…
Add table
Reference in a new issue