From ebcee954bf96f3fd5af44f42da64f5fb2bf343b2 Mon Sep 17 00:00:00 2001 From: Asraelite Date: Mon, 21 Mar 2016 16:15:49 +0000 Subject: [PATCH] add start of client rendering --- public/css/FreePixel.ttf | Bin 0 -> 64880 bytes public/css/styles.css | 6 +++ public/index.html | 1 + .../events.js => public/js/starbugs/chat.js | 0 public/js/starbugs/input.js | 0 public/js/starbugs/main.js | 24 ++++++++- public/js/starbugs/net.js | 17 +++++++ public/js/starbugs/render/render.js | 24 +++++++++ public/js/starbugs/world/physics.js | 0 public/js/starbugs/world/player.js | 5 ++ public/js/starbugs/world/ship.js | 0 server/game/net/connection.js | 47 +++++++++++++++++- server/game/net/index.js | 10 ++-- 13 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 public/css/FreePixel.ttf rename server/game/net/events.js => public/js/starbugs/chat.js (100%) create mode 100644 public/js/starbugs/input.js create mode 100644 public/js/starbugs/net.js create mode 100644 public/js/starbugs/render/render.js create mode 100644 public/js/starbugs/world/physics.js create mode 100644 public/js/starbugs/world/player.js create mode 100644 public/js/starbugs/world/ship.js diff --git a/public/css/FreePixel.ttf b/public/css/FreePixel.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d22b2a296df3c5d5ddcfad50069e48a9f13a4789 GIT binary patch literal 64880 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 + diff --git a/server/game/net/events.js b/public/js/starbugs/chat.js similarity index 100% rename from server/game/net/events.js rename to public/js/starbugs/chat.js diff --git a/public/js/starbugs/input.js b/public/js/starbugs/input.js new file mode 100644 index 0000000..e69de29 diff --git a/public/js/starbugs/main.js b/public/js/starbugs/main.js index 160ae78..61d245e 100644 --- a/public/js/starbugs/main.js +++ b/public/js/starbugs/main.js @@ -2,8 +2,28 @@ window.addEventListener('load', init); -var socket; +var game; function init() { - socket = io.connect('http://localhost:8080'); + game = new Game(); + + game.tick(); + + game.net.connect(); +} + +function Game() { + var self = this; + + this.connected = false; + this.state = 'connecting'; + + this.net = new Net(); + this.renderer = new Renderer(); + + this.tick = function() { + self.renderer.render(self.state); + + requestAnimationFrame(self.tick); + } } diff --git a/public/js/starbugs/net.js b/public/js/starbugs/net.js new file mode 100644 index 0000000..dd8e078 --- /dev/null +++ b/public/js/starbugs/net.js @@ -0,0 +1,17 @@ +function Net() { + this.socket; + + this.connect = function() { + this.socket = io.connect('http://localhost:8080'); + + this.socket.on('connect', function() { + game.connected = true; + game.state = 'connected'; + }); + + this.socket.on('disconnect', function() { + game.connected = false; + game.state = 'disconnected'; + }); + }; +} diff --git a/public/js/starbugs/render/render.js b/public/js/starbugs/render/render.js new file mode 100644 index 0000000..39f3812 --- /dev/null +++ b/public/js/starbugs/render/render.js @@ -0,0 +1,24 @@ +function Renderer() { + var self = this; + + var canvas = document.getElementsByTagName('canvas')[0]; + var context = canvas.getContext('2d'); + var pallet = new Pallet(); + + this.render = function(state) { + if (state == 'connecting' || state == 'disconnected') { + pallet.clear(); + pallet.fill('#111'); + var str = state == 'connecting' ? 'Connecting' : 'Shit\'s ' + + 'diconnected, yo!'; + pallet.text(str, canvas.width / 2, canvas.height / 2, '#fff', 'FreePixel', 16, 'center', 'middle'); + return; + } + + pallet.clear(); + pallet.fill('#000'); + } + + pallet.fillScreen(); + window.addEventListener('resize', pallet.fillScreen); +} diff --git a/public/js/starbugs/world/physics.js b/public/js/starbugs/world/physics.js new file mode 100644 index 0000000..e69de29 diff --git a/public/js/starbugs/world/player.js b/public/js/starbugs/world/player.js new file mode 100644 index 0000000..fb34190 --- /dev/null +++ b/public/js/starbugs/world/player.js @@ -0,0 +1,5 @@ +function Player(own, name, ship) { + this.name = name; + this.ship = ship; + this.own = own; +} diff --git a/public/js/starbugs/world/ship.js b/public/js/starbugs/world/ship.js new file mode 100644 index 0000000..e69de29 diff --git a/server/game/net/connection.js b/server/game/net/connection.js index 316fa39..2836f87 100644 --- a/server/game/net/connection.js +++ b/server/game/net/connection.js @@ -1,8 +1,51 @@ 'use strict'; class Connection { - constructor() { - + constructor(net, socket) { + this.net = net; + this.connections = net.connections; + this.io = net.io; + this.socket = socket; + + this.player = false; + this._room = false; + this.name = ''; + this.chatCooldown = 0; + + socket.on('chat', data => { + this.chat(data); + }); + + socket.on('setName', data => { + this.player.name = data.name; + }); + + this.room = 'egg'; + } + + chat(data) { + console.log(this.room); + if(this.chatCooldown > 5 || !this.room) return; + + this.chatCooldown++; + this.io.to(this.room).emit('chat', { + name: this.player.name, + msg: data.msg.slice(0, 100) + }); + } + + tick() { + this.chatCooldown -= 1; + } + + get room() { + return this._room; + } + + set room(str) { + this.socket.leave(this._room); + this.socket.join(str); + this._room = str; } } diff --git a/server/game/net/index.js b/server/game/net/index.js index c4caefe..b793de1 100644 --- a/server/game/net/index.js +++ b/server/game/net/index.js @@ -7,16 +7,20 @@ const Connection = require('./connection.js'); class GameNet { constructor() { this.io = socketio(starbugs.webServer.appServer); + + this.connections = new Map(); } listen() { let io = this.io; + let cons = this.connections; this.io.on('connection', socket => { - console.log('connection'); + let id = socket.id; + cons.set(id, new Connection(this, socket)); - socket.on('other event', data => { - console.log(data); + socket.on('disconnect', _ => { + cons.delete(id); }); }); }