HTML5 multijugador, Node.js, Socket.IO [cerrado]

13

Intento crear un multijugador simple con HTML5 Canvas, JavaScript (también usando la biblioteca de herencia simple John Resig) y Node.js con Socket.IO. Mi código de cliente:

var lienzo = document.getElementById ('juego');
contexto var = canvas.getContext ('2d');
zócalo var = nuevo io.Socket ('127.0.0.1', {puerto: 8080});

jugador var = nulo;

var UP = 'UP',
    IZQUIERDA = 'IZQUIERDA',
    ABAJO = 'ABAJO',
    DERECHA = 'DERECHA';

socket.connect ();

socket.on ('connect', function () {socket.send ();
    console.log ('¡Conectado!');
    jugador = nuevo jugador (50, 50);
});

socket.on ('mensaje', función (msg) {
    if (msg == 'ARRIBA') {
        player.moveUP ();
    } else if (msg == 'IZQUIERDA') {
        player.moveLEFT ();
    } else if (msg == 'ABAJO') {
        player.moveDOWN ();
    } else if (msg == 'DERECHA') {
        player.moveRIGHT ();
    } más {

    }
});

socket.on ('desconectar', función () {
    console.log ('¡Desconectado!');
});

var Player = Class.extend ({
    init: función (x, y) {
        this.x = x;
        this.y = y;
    },
    setX: function (x) {
        this.x = x;
    },
    getX: function () {
        devuelve this.x;
    },
    setY: función (y) {
        this.y = y;
    },
    getY: function () {
        devuelve this.y;
    },
    dibujar: función () {
        context.clearRect (0, 0, 350, 150);
        context.fillRect (this.x, this.y, 15, 15);
    },
    mover: función () {
        this.x + = 1;
        this.y + = 1;
    },
    moveUP: function () {
        this.y--;
    },
    moveLEFT: function () {
        esta X--;
    },
    moveDOWN: function () {
        this.y ++;
    },
    moveRIGHT: function () {
        this.x ++;
    }
});

función checkKeyCode (evento) {
    var keyCode;
    if (evento == nulo) {
        keyCode = window.event.keyCode;
    } más {
        keyCode = event.keyCode;
    }

    interruptor (keyCode) {
        caso 38: // ARRIBA
            player.moveUP ();
            socket.send (ARRIBA);
        descanso;
        caso 37: // IZQUIERDA
            player.moveLEFT ();
            socket.send (IZQUIERDA);
        descanso;
        caso 40: // ABAJO
            player.moveDOWN ();
            socket.send (ABAJO);
        descanso;
        caso 39: // DERECHO
            player.moveRIGHT ();
            socket.send (DERECHA);
        descanso;
        defecto:
        descanso;

    }

}

actualización de función () {
    jugador.draw ();
}

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

función init () {
    document.onkeydown = checkKeyCode;
}

en eso();

Y el código del servidor:

var http = require ('http'),
    io = require ('socket.io'),
    buffer = nueva matriz (),

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

Hola Mundo

'); }); server.listen (8080); zócalo var = io.listen (servidor); socket.on ('conexión', función (cliente) { client.on ('mensaje', función (mensaje) { console.log (mensaje); client.broadcast (mensaje); }) client.on ('desconectar', función () { }) });

Y cuando ejecuto dos clientes, con el primer cliente puedo mover el segundo cliente Rect y con el segundo cliente mover el primer cliente rect y algo así como con el tercer cliente puede mover el primer y segundo cliente rect.

Tengo dudas sobre cómo crear un multijugador real. algo como: Abra tres clientes y el primer cliente obtenga rect1, segundo rect2 y último rect3. El primer cliente solo puede mover rect1, el tercero solo puede mover rect3.

Tal vez alguien tiene idea? Busco en Google pero no encuentro la respuesta.

Perdón por mi idioma inglés, gracias.

rhavd
fuente

Respuestas:

15

He creado un marco específico para crear juegos HTML5 multijugador en tiempo real, basado en el modelo Cliente / Servidor. En este modelo, los jugadores solo envían entradas al servidor (se presionan las teclas), y el juego ocurre en el servidor.

El servidor envía instantáneas mundiales cronometradas a todos los clientes, y los clientes se hacen retroceder 75 ms en el tiempo desde la hora actual, al encontrar dos actualizaciones mundiales conocidas entre las que se encuentra su tiempo de procesamiento.

Repositorio (contiene 3 demos)
https://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs

Video Box2D demo en acción:
http://vimeo.com/24149718

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

Está basado en los informes técnicos del motor Quakeworld y Valve's Source:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

onedayitwillmake
fuente
¡Felicitaciones por este marco!
MrYoshiji
sí, así es como planeo ejecutar mi juego, ¡tiene sentido simplemente enviar la entrada!
Nikos