Multiplayer HTML5, Node.js, Socket.IO [chiuso]


13

Sto provando a creare un semplice multigiocatore con HTML5 Canvas, JavaScript (usando anche la semplice libreria di ereditarietà di John Resig) e Node.js con Socket.IO. Il mio codice cliente:

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

var player = null;

var UP = 'UP',
    SINISTRA = "SINISTRA",
    GIÙ = "GIÙ",
    DESTRA = 'DESTRA';

Socket.connect ();

socket.on ('connect', function () {socket.send ();
    console.log ( 'Connected!');
    giocatore = nuovo giocatore (50, 50);
});

socket.on ('message', function (msg) {
    if (msg == 'UP') {
        player.moveUP ();
    } else if (msg == 'SINISTRA') {
        player.moveLEFT ();
    } altrimenti if (msg == 'DOWN') {
        player.moveDOWN ();
    } altrimenti if (msg == 'DESTRA') {
        player.moveRIGHT ();
    } altro {

    }
});

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 () {
        restituisce this.x;
    },
    setY: function (y) {
        this.y = y;
    },
    getY: function () {
        restituire 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 ++;
    }
});

funzione checkKeyCode (evento) {
    var keyCode;
    if (evento == null) {
        keyCode = window.event.keyCode;
    } altro {
        keyCode = event.keyCode;
    }

    switch (keyCode) {
        caso 38: // SU
            player.moveUP ();
            socket.send (UP);
        rompere;
        caso 37: // SINISTRA
            player.moveLEFT ();
            socket.send (LEFT);
        rompere;
        caso 40: // GIÙ
            player.moveDOWN ();
            socket.send (DOWN);
        rompere;
        caso 39: // DESTRA
            player.moveRIGHT ();
            socket.send (RIGHT);
        rompere;
        predefinito:
        rompere;

    }

}

aggiornamento funzioni () {
    player.draw ();
}

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

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

dentro();

E codice server:

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

server = http.createServer (funzione (req, res) {
    res.writeHead (200, {'Content-Type': 'text / html'});
    res.end ('

Ciao mondo

'); }); server.listen (8080); var socket = io.listen (server); socket.on ('connection', function (client) { client.on ('message', function (message) { console.log (messaggio); client.broadcast (messaggio); }) client.on ('disconnect', function () { }) });

E quando eseguo due client, io con il primo client posso spostare il secondo client Rect e con il secondo client spostare il primo client rect e qualcosa come con il terzo client può spostare il primo e il secondo client rect.

Ho una domanda su come creare un vero multigiocatore? qualcosa come: Apri tre client e il primo client ottiene rect1, il secondo rect2 e l'ultimo rect3. Solo il primo client può spostare rect1, il terzo client può spostare solo rect3.

Forse qualcuno ne ha idea? Cerco su Google ma non trovo la risposta.

Ci scusiamo per la mia lingua inglese, grazie.

Risposte:


15

Ho creato un framework specifico per la creazione di giochi multiplayer in tempo reale HTML5, basato sul modello client / server. In questo modello, i giocatori inviano solo input al server (premendo i tasti) - e il gioco si verifica sul server.

Il server invia istantanee temporizzate a tutti i client e i client si dicono 75 ms indietro nel tempo rispetto all'ora corrente, trovando due aggiornamenti mondiali conosciuti tra i loro tempi di rendering.

Repository (contiene 3 demo)
https://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs

Demo Video Box2D in azione:
http://vimeo.com/24149718

Diapositive da JSConf 2011:
http://www.slideshare.net/MarioGonzalez15/realtime-html5-multiplayergameswithnodejs-7868336

È basato sui white paper di Quakeworld e Valve's Engine:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


Congratulazioni per questo Framework!
MrYoshiji,

sì, è così che ho intenzione di far funzionare il mio gioco, ha senso semplicemente inviare l'input!
Nikos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.