2011-06-05 3 views
17

Я пытаюсь создать простой мультиплеер с холстом HTML5, JavaScript (тоже с использованием простой библиотеки наследования John Resig) и Node.js с Socket.IO. Мой код клиента:Многопользовательский 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(); 

И код сервера:

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(){ 

    }) 

}); 

И когда я бегу я два клиента с первого клиента может двигаться второй клиент Rect и со вторым клиентом переместить первый прямоугольник клиента и что-то подобное с третий клиент может перемещать первый и второй клиентские прямоугольники.

У меня есть вопрос, как создать настоящий мультиплеер? что-то вроде: Открыть трех клиентов и первый клиент получить rect1, второй rect2 и последний rect3. Первый клиент может только перемещать rect1, третий клиент может перемещать только rect3.

Возможно, у кого есть идея? Я ищу в Google, но не нахожу ответа.

Извините за мой английский язык.

ответ

14

Во-первых, проверить http://www.google.com/events/io/2011/sessions/super-browser-2-turbo-hd-remix-introduction-to-html5-game-development.html

объясняет, как использовать requestAnimationFrame среди других вещей.

Во-вторых, игровое состояние должно существовать на сервере и отражаться на клиентах.

Когда игрок щелкает вниз, клиент должен только отправить сообщение. Затем сервер должен отправить сообщение всем клиентам, включая клиента, который принял это действие.

Каждый игрок должен существовать как объект на сервере. Когда игрок входит в систему, они должны обновляться о статусе каждого игрока, уже находящегося на сервере.

модифицированный код клиента: http://codr.cc/s/d0154536/js

модифицированный код сервера: What every programmer needs to know about game networking -Статья http://codr.cc/s/f96ce1d2/js

+1

Супер-браузер 2 турбо HD введение ремикс на развитие игры HTML5 является удивительным! Спасибо за ответы! generalhenry, я пробую ваш код клиент/сервер, но для моего не работает. Но спасибо, что помогли мне понять Multi-Player! – rhavd

+1

Я не тестировал свой модифицированный код, поэтому есть некоторые ошибки, но вы получаете идею^_^ – generalhenry

+1

Все ссылки в данный момент мертвы от этого ответа. –

11

Гленн Фидлера хорошо читать для тех, кто хочет попасть в игру сети. Он объясняет основы на очень высоком уровне, чтобы он был адаптирован для JS и Socket.io.

+0

Блестящий ресурс. Благодаря :) –

0

Если кто-то наткнулся на этот вопрос, как я сейчас, я хотел бы добавить this link as an example.

Я следил за тем же путем, как и несколько месяцев назад, и прочитал каждую статью, которую я смог найти на авторитарной модели сервера (включая ту, которая указана в ответе от @Epeli), и как реализовать ее с помощью nodejs/socketio ,

Результат моего исследования проявился в проекте github, расположенном по ссылке, приведенной выше (есть также живая демонстрация). Надеюсь, это поможет кому-то.

0

Существует в настоящее время открытым исходным кодом мультиплеер в реальном времени Javascript сервер (и клиент библиотека) называется Lance.gg, которая обеспечивает, как вы говорите, настоящий многопользовательский опыт

Он обрабатывает на стороне клиента предсказания, шаг дрейф , изгиб и фундаментальная физика.

Отказ от ответственности: Я один из авторов

Смежные вопросы