Multijoueur HTML5, Node.js, Socket.IO [fermé]

13

J'essaie de créer un multijoueur simple avec HTML5 Canvas, JavaScript (également en utilisant la bibliothèque d'héritage simple John Resig) et Node.js avec Socket.IO. Mon code client:

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',
    DROIT = 'DROIT';

socket.connect ();

socket.on ('connect', function () {socket.send ();
    console.log ('Connecté!');
    joueur = nouveau joueur (50, 50);
});

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

    }
});

socket.on ('déconnecter', fonction () {
    console.log ('Déconnecté!');
});

var Player = Class.extend ({
    init: fonction (x, y) {
        this.x = x;
        this.y = y;
    },
    setX: fonction (x) {
        this.x = x;
    },
    getX: function () {
        renvoyer this.x;
    },
    setY: fonction (y) {
        this.y = y;
    },
    getY: function () {
        retourner 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 () {
        Cette x--;
    },
    moveDOWN: fonction () {
        this.y ++;
    },
    moveRIGHT: function () {
        this.x ++;
    }
});

fonction checkKeyCode (événement) {
    var keyCode;
    if (événement == null) {
        keyCode = window.event.keyCode;
    } autre {
        keyCode = event.keyCode;
    }

    switch (keyCode) {
        cas 38: // UP
            player.moveUP ();
            socket.send (UP);
        Pause;
        cas 37: // GAUCHE
            player.moveLEFT ();
            socket.send (LEFT);
        Pause;
        cas 40: // DOWN
            player.moveDOWN ();
            socket.send (DOWN);
        Pause;
        cas 39: // DROIT
            player.moveRIGHT ();
            socket.send (RIGHT);
        Pause;
        défaut:
        Pause;

    }

}

mise à jour de la fonction () {
    player.draw ();
}

var FPS = 30;
setInterval (fonction () {
    mise à jour();
    player.draw ();
}, 1000 / FPS);

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

init ();

Et code serveur:

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

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

Bonjour le monde

'); }); server.listen (8080); var socket = io.listen (serveur); socket.on ('connexion', fonction (client) { client.on ('message', fonction (message) { console.log (message); client.broadcast (message); }) client.on ('déconnecter', fonction () { }) });

Et quand j'exécute deux clients, je avec le premier client peut déplacer le deuxième client Rect et avec le deuxième client déplacer le premier client rect et quelque chose comme avec le troisième client peut déplacer le premier et le deuxième client rect.

Je me demande comment créer un vrai Multi-Player? quelque chose comme: Ouvrez trois clients et le premier client obtenez rect1, deuxième rect2 et dernier rect3. Le premier client ne peut déplacer que rect1, le troisième client ne peut déplacer que rect3.

Peut-être que quelqu'un a une idée? Je recherche dans Google mais je ne trouve pas de réponse.

Désolé pour ma langue anglaise, merci.

rhavd
la source

Réponses:

15

J'ai créé un framework spécifiquement pour créer des jeux multijoueurs HTML5 en temps réel, basé sur le modèle Client / Serveur. Dans ce modèle, les joueurs n'envoient que des entrées au serveur (les touches étant pressées) - et le jeu se déroule sur le serveur.

Le serveur envoie des instantanés du monde chronométrés à tous les clients, et les clients se rendent à 75 ms en arrière par rapport à l'heure actuelle, en trouvant deux mises à jour du monde connues entre lesquelles se situe leur temps de rendu.

Référentiel (contient 3 démos)
https://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs

Démo de Video Box2D en action:
http://vimeo.com/24149718

Diapositives de JSConf 2011:
http://www.slideshare.net/MarioGonzalez15/realtime-html5-multiplayergameswithnodejs-7868336

Il est basé sur les livres blancs du moteur source de Quakeworld et de Valve:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

onedayitwillmake
la source
Félicitations pour ce cadre!
MrYoshiji
Ouais, c'est comme ça que je prévois de lancer mon jeu, il est logique d'envoyer simplement les données!
Nikos