papercats/game-client.js

157 lines
4.1 KiB
JavaScript
Raw Normal View History

2017-02-25 18:52:52 -05:00
/* global $ */
var Player = require("./player.js");
2017-02-25 18:52:52 -05:00
var renderer = require("./game-renderer.js");
var consts = require("./game-consts.js");
var GRID_SIZE = consts.GRID_SIZE;
var CELL_WIDTH = consts.CELL_WIDTH;
renderer.allowAnimation = true;
2017-02-21 00:54:44 -05:00
/**
* Provides requestAnimationFrame in a cross browser way.
* @author paulirish / http://paulirish.com/
*/
// window.requestAnimationFrame = function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {
// window.setTimeout( callback, 1000 / 60 );
// };
2017-02-21 00:54:44 -05:00
if ( !window.requestAnimationFrame ) {
window.requestAnimationFrame = ( function() {
return window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {
window.setTimeout( callback, 1000 / 60 );
};
})();
}
2017-02-21 17:17:06 -05:00
var user, socket, frame;
2017-02-21 00:54:44 -05:00
//Event listeners
$(document).keydown(function(e) {
if (user.dead)
return;
var newHeading = -1;
switch (e.which)
2017-02-21 00:54:44 -05:00
{
case 37: newHeading = 3; break; //LEFT
case 38: newHeading = 0; break; //UP
case 39: newHeading = 1; break; //RIGHT
case 40: newHeading = 2; break; //DOWN
default: return; //exit handler for other keys.
2017-02-21 00:54:44 -05:00
}
if (newHeading === user.currentHeading || ((newHeading % 2 === 0) ^
(user.currentHeading % 2 === 0)))
2017-02-21 00:54:44 -05:00
{
user.heading = newHeading;
if (socket)
socket.emit("frame", {
frame: frame,
heading: newHeading
}, function(success, msg) {
if (!success)
{
//TODO: restore frames.
console.error(msg);
}
});
2017-02-21 00:54:44 -05:00
}
e.preventDefault();
});
2017-02-21 00:54:44 -05:00
$(function() {
var grid = renderer.grid;
2017-02-22 19:51:41 -05:00
//Socket connection.
2017-02-25 23:25:06 -05:00
socket = require('socket.io-client')('localhost:8081');
socket.on('connect', function(){
console.info("Connected to server.");
socket.emit('hello', {
name: 'Test player',
type: 0, //Free-for-all
gameid: -1 //Requested game-id, or -1 for anyone.
}, function(success) {
if (success) console.info("Connected to game!");
else console.error("Unable to connect to game.");
});
});
2017-02-25 23:25:06 -05:00
socket.on('game', function(data) {
//Initialize game.
//TODO: display data.gameid --- game id #
2017-02-25 23:25:06 -05:00
requestAnimationFrame(function() {
renderer.reset();
//Load players.
data.players.forEach(function(p) {
renderer.addPlayer(new Player(true, grid, p));
});
user = renderer.getPlayerFromNum(data.num);
renderer.setUser(user);
//Load grid.
var gridData = new Uint8Array(data.grid);
for (var r = 0; r < grid.size; r++)
for (var c = 0; c < grid.size; c++)
{
var ind = gridData[r * grid.size + c] - 1;
grid.set(r, c, ind === -1 ? null : renderer.getPlayer(ind));
}
frame = data.frame;
});
});
2017-02-25 18:52:52 -05:00
2017-02-25 23:25:06 -05:00
socket.on('notifyFrame', function(data, fn) {
if (data.frame - 1 !== frame)
{
console.error("Frames don't match up!");
socket.emit('requestFrame'); //Restore data.
return;
}
frame++;
2017-02-25 23:25:06 -05:00
requestAnimationFrame(function() {
if (data.newPlayers)
{
data.newPlayers.forEach(function(p) {
renderer.addPlayer(new Player(true, grid, p));
});
}
data.moves.forEach(function(val, i) {
//if (renderer.getPlayer(val) !== user)
// renderer.getPlayer(i).heading = val.heading;
});
2017-02-25 23:25:06 -05:00
paintLoop();
});
2017-02-25 23:25:06 -05:00
fn();
});
2017-02-21 00:54:44 -05:00
socket.on('disconnect', function(){
console.info("Server has disconnected. Creating new game.");
});
2017-02-21 17:17:06 -05:00
var deadFrames = 0;
function paintLoop()
{
renderer.paint();
renderer.update();
if (user.dead)
2017-02-21 17:17:06 -05:00
{
2017-02-25 23:25:06 -05:00
if (deadFrames === 60) //One second of frames
{
deadFrames = 0;
return;
}
socket.disconnect();
deadFrames++;
requestAnimationFrame(paintLoop);
2017-02-21 17:17:06 -05:00
}
}
});