Archived
1
0
Fork 0
This repository has been archived on 2019-02-05. You can view files and clone it, but cannot push or open issues or pull requests.
Pong/index.js
2017-01-21 01:01:23 +01:00

154 lines
4 KiB
JavaScript

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
var sockets = [];
var gameState = 0;
var width, height;
var startinterval;
/** Game-Config **/
var cube_width = 50,
cube_height = 200,
speed = 7;
/** ########## **/
/** CONNECTION **/
/** ########## **/
io.on('connection', function(socket){
var id = sockets.length + 1;
if(sockets.length == 1)
if(sockets[0].id == 2) id = 1;
var clientkey = sockets.push(new Client(id, socket)) - 1;
console.log('Client connected. ID=' + id);
/** ######### **/
/** HANDSHAKE **/
/** ######### **/
socket.emit('handshake', id, gameState, cube_width, cube_height, speed, function(w, h){ // Callback function for 1st Client to set screen size //
sockets[clientkey].width = w;
sockets[clientkey].height = h;
if(sockets.length > 1 && gameState == 0) setUp(socket);
});
if(gameState > 0) socket.emit('size', width, height);
/** #### **/
/** Ping **/
/** ### **/
socket.on('appping', function(fn){
fn(Date.now());
});
/** #### **/
/** Ballshoot **/
/** ### **/
socket.on('ballshoot', function(y){
socket.broadcast.emit('shootball', y);
});
/** ################ **/
/** Paddel V-Change **/
/** ############## **/
socket.on('vchange', function(pos, val, y){
socket.broadcast.emit('changeV', pos, val, y);
});
/** ########## **/
/** DISCONNECT **/
/** ########## **/
socket.on('disconnect', function(){
var index;
sockets.forEach(function(sock, ind){
if (sock.socket == socket){
index = ind;
return;
}
});
var oldid = sockets[index].id;
sockets.splice(index, 1);
console.log('Client disconnected. ID=' + (oldid+1));
if(sockets.length == 1){
sockets[0].socket.emit('test', 'player_left'); //TODO win-event
console.log('Only one Player left. Sending win-event');
// Debug Restart:
gameState = 0;
clearInterval(startinterval);
broadcastGameState(socket);
return;
}
else if(sockets.length == 0){
console.log('All Players left. Reseting lobby...');
gameState = 0;
id = 0;
return;
}
var key = 0;
if(sockets[0].id == 1 || sockets[0].id == 2) key = 1;
switch(oldid){
case 1 : sockets[key].id = 1; sockets[key].socket.emit('handshake', 1); console.log('New Player 1 selected.'); setUp(); break;
case 2 : sockets[key].id = 2; sockets[key].socket.emit('handshake', 2); console.log('New Player 2 selected.'); setUp(); break;
default : console.log('Spectator left. Nothing need to select new Players.'); break;
}
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
function setUp(socket){
gameState = 1;
broadcastGameState(socket);
console.log('Starting SetUp...');
/** Select smalest screensize and set for all clients **/
sockets.forEach(function(sock){
broadcastGameState(socket);
if(sock.id == 1)
sockets.forEach(function(sock2){
if(sock2.id == 2){
if(sock.width < sock2.width)
width = sock.width;
else
width = sock2.width;
if(sock.height < sock2.height)
height = sock.height;
else
height = sock2.height;
}
});
});
socket.emit('size', width, height);
socket.broadcast.emit('size', width, height);
var i = 5;
startinterval = setInterval(function(){
i--;
socket.emit('countdown', i);
socket.broadcast.emit('countdown', i);
if(i == 0){
clearInterval(startinterval);
gameState = 2;
broadcastGameState(socket);
socket.emit('start');
socket.broadcast.emit('start');
}
}, 1000);
}
function broadcastGameState(socket){
socket.emit('gamestate', gameState);
socket.broadcast.emit('gamestate', gameState);
}
function Client(id, socket){
this.id = id;
this.socket = socket;
this.width = 0;
this.height = 0;
}