2011-06-05 3 views
17

Ho provato a creare un semplice Multiplayer con HTML5 Canvas, JavaScript (anche utilizzando la libreria di ereditarietà di John Resig simple) e Node.js con Socket.IO. Il mio codice cliente:Multiplayer HTML5, Node.js, Socket.IO

var canvas = document.getElementById('game'); 
var context = canvas.getContext('2d'); 
var socket = new io.Socket('127.0.0.1', {port: 8080}); 

var player = null; 

var UP = 'UP', 
    LEFT = 'LEFT', 
    DOWN = 'DOWN', 
    RIGHT = 'RIGHT'; 

socket.connect(); 

socket.on('connect', function() {socket.send(); 
    console.log('Connected!'); 
    player = new Player(50, 50); 
}); 

socket.on('message', function(msg) { 
    if(msg == 'UP') { 
     player.moveUP(); 
    } else if(msg == 'LEFT') { 
     player.moveLEFT(); 
    } else if(msg == 'DOWN') { 
     player.moveDOWN(); 
    } else if(msg == 'RIGHT') { 
     player.moveRIGHT(); 
    } else { 

    } 
}); 

socket.on('disconnect', function() { 
    console.log('Disconnected!'); 
}); 

var Player = Class.extend({ 
    init : function(x, y) { 
     this.x = x; 
     this.y = y; 
    }, 
    setX : function(x){ 
     this.x = x; 
    }, 
    getX : function(){ 
     return this.x; 
    }, 
    setY : function(y){ 
     this.y = y; 
    }, 
    getY : function(){ 
     return this.y; 
    }, 
    draw : function(){ 
     context.clearRect(0, 0, 350, 150); 
     context.fillRect(this.x, this.y, 15, 15); 
    }, 
    move : function() { 
     this.x += 1; 
     this.y += 1; 
    }, 
    moveUP : function() { 
     this.y--; 
    }, 
    moveLEFT : function() { 
     this.x--; 
    }, 
    moveDOWN : function() { 
     this.y++; 
    }, 
    moveRIGHT : function() { 
     this.x++; 
    } 
}); 

function checkKeyCode(event) { 
    var keyCode; 
    if(event == null) { 
     keyCode = window.event.keyCode; 
    } else { 
     keyCode = event.keyCode; 
    } 

    switch(keyCode) { 
     case 38: // UP 
      player.moveUP(); 
      socket.send(UP); 
     break; 
     case 37: // LEFT 
      player.moveLEFT(); 
      socket.send(LEFT); 
     break; 
     case 40: //DOWN 
      player.moveDOWN(); 
      socket.send(DOWN); 
     break; 
     case 39: // RIGHT 
      player.moveRIGHT(); 
      socket.send(RIGHT); 
     break; 
     default: 
     break; 

    } 

} 

function update() { 
    player.draw(); 
} 

var FPS = 30; 
setInterval(function() { 
    update(); 
    player.draw(); 
}, 1000/FPS); 

function init() { 
    document.onkeydown = checkKeyCode; 
} 

init(); 

E il codice del server:

var http = require('http'), 
io = require('socket.io'), 
buffer = new Array(), 

server = http.createServer(function(req, res){ 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end('<h1>Hello world</h1>'); 
}); 
server.listen(8080); 

var socket = io.listen(server); 

socket.on('connection', function(client){ 

    client.on('message', function(message){ 
     console.log(message); 
     client.broadcast(message); 
    }) 
    client.on('disconnect', function(){ 

    }) 

}); 

E quando corro ho due del cliente con il primo cliente può muoversi secondo client Rect e con il secondo cliente muoversi prima rect cliente e qualcosa di simile con il terzo client può spostare il primo e il secondo client di rect.

Ho una domanda su come creare un vero Multi-Player? qualcosa come: Aprire tre client e il primo client ottenere rect1, secondo rect2 e l'ultimo rect3. Il primo client può solo spostare rect1, il terzo client può spostare solo rect3.

Forse qualcuno ha un'idea? Cerco su Google ma non trovo risposta.

Ci scusiamo per la mia lingua inglese.

risposta

14

primo luogo, verificare http://www.google.com/events/io/2011/sessions/super-browser-2-turbo-hd-remix-introduction-to-html5-game-development.html

spiega come utilizzare requestAnimationFrame tra le altre cose.

In secondo luogo, lo stato del gioco deve esistere sul server ed essere specchiato sui client.

Quando un giocatore fa clic, il client deve solo inviare un messaggio. Il server dovrebbe quindi inviare un messaggio a tutti i client, incluso il client che ha intrapreso l'azione.

Ogni giocatore deve esistere come oggetto sul server. Quando un giocatore accede, dovrebbe essere aggiornato sullo stato di ciascun giocatore già presente sul server.

codice client modificato: http://codr.cc/s/d0154536/js

codice del server modificato: What every programmer needs to know about game networking -Articolo di http://codr.cc/s/f96ce1d2/js

+1

Super navigatore 2 Turbo HD Remix Introduzione allo sviluppo HTML5 gioco è impressionante! Grazie per le risposte! generalhenry, provo il tuo codice client/server in uso, ma per il mio non funziona. Ma grazie per aiutarmi a capire Multi-Player! – rhavd

+1

Non ho testato il mio codice modificato quindi ci sono probabilmente alcuni bug, ma l'idea è^_^ – generalhenry

+1

Tutti i collegamenti sono attualmente morti da questa risposta. –

11

Glenn Fiedler è buona lettura per tutti coloro che vogliono entrare in rete di gioco. Spiega le basi in un livello molto alto in modo che sia adattabile per JS e Socket.io.

+0

Risorsa brillante. Grazie :) –

0

Nel caso in cui qualcuno si imbattesse in questa domanda come ho appena ora, volevo aggiungere this link as an example.

Stavo seguendo lo stesso percorso dell'op alcuni mesi fa e leggevo ogni articolo che potevo trovare sul modello autorevole del server (incluso quello indicato nella risposta da @Epeli), e come implementarlo con nodejs/socketio .

Il risultato della mia ricerca si è manifestato nel progetto github che si trova al link sopra riportato (c'è anche una demo dal vivo). Spero che questo aiuti qualcuno.

0

V'è ora un multiplayer in tempo reale open-source javascript server (e libreria client) chiamato Lance.gg, che prevede, come dici tu, un vero e proprio multiplayer esperienza

Gestisce previsione sul lato client, passo deriva , piegatura e fisica di base.

Disclaimer: io sono uno dei collaboratori