Мультиплеєр HTML5, Node.js, Socket.IO [закрито]


13

Я намагаюся створити простий мультиплеєр з HTML5 Canvas, JavaScript (теж використовуючи просту бібліотеку наслідування John Resig) та Node.js з Socket.IO. Мій клієнтський код:

var canvas = document.getElementById ('гра');
var контекст = canvas.getContext ('2d');
var socket = новий io.Socket ('127.0.0.1', {порт: 8080});

var player = null;

var UP = 'UP',
    LEFT = 'ВЛІВО',
    DOWN = 'DOWN',
    RIGHT = 'ВПРАВО';

socket.connect ();

socket.on ('підключити', функцію () {socket.send ();
    console.log ("Підключено!");
    гравець = новий гравець (50, 50);
});

socket.on ('повідомлення', функція (msg) {
    if (msg == 'UP') {
        player.moveUP ();
    } else if (msg == 'ВЛИВО') {
        player.moveLEFT ();
    } else if (msg == 'DOWN') {
        player.moveDOWN ();
    } else if (msg == 'ПРАВА') {
        player.moveRIGHT ();
    } else {

    }
});

socket.on ('відключити', функцію () {
    console.log ('Відключено!');
});

var Player = Class.extend ({
    init: функція (x, y) {
        this.x = x;
        this.y = y;
    },
    setX: функція (x) {
        this.x = x;
    },
    getX: function () {
        повернути це.x;
    },
    setY: функція (y) {
        this.y = y;
    },
    getY: function () {
        повернути це.y;
    },
    draw: function () {
        контекст.clearRect (0, 0, 350, 150);
        контекст.fillRect (this.x, this.y, 15, 15);
    },
    move: function () {
        це.x + = 1;
        this.y + = 1;
    },
    moveUP: function () {
        this.y--;
    },
    moveLEFT: функція () {
        this.x--;
    },
    moveDOWN: function () {
        this.y ++;
    },
    moveRIGHT: function () {
        this.x ++;
    }
});

функція checkKeyCode (подія) {
    var keyCode;
    if (event == null) {
        keyCode = window.event.keyCode;
    } else {
        keyCode = event.keyCode;
    }

    перемикач (keyCode) {
        справа 38: // ВП
            player.moveUP ();
            socket.send (UP);
        перерву;
        випадок 37: // ЛІВ
            player.moveLEFT ();
            socket.send (Вліво);
        перерву;
        справа 40: // Вниз
            player.moveDOWN ();
            socket.send (Вниз);
        перерву;
        випадок 39: // ВПРАВО
            player.moveRIGHT ();
            socket.send (ВПРАВО);
        перерву;
        за замовчуванням:
        перерву;

    }

}

оновлення функції () {
    player.draw ();
}

var FPS = 30;
setInterval (функція () {
    update ();
    player.draw ();
}, 1000 / FPS);

функція init () {
    document.onkeydown = checkKeyCode;
}

в цьому();

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

var http = need ('http'),
    io = вимагати ('socket.io'),
    буфер = новий масив (),

server = http.createServer (функція (req, res) {
    res.writeHead (200, {'Content-Type': 'text / html'});
    res.end ('

Привіт Світ

'); }); server.listen (8080); var socket = io.listen (сервер); socket.on ('з'єднання', функція (клієнт) { client.on ('повідомлення', функція (повідомлення) { console.log (повідомлення); client.broadcast (повідомлення); }) client.on ('відключити', функцію () { }) });

І коли я запускаю два клієнта, я з першим клієнтом можу перемістити Rect другого клієнта, а з другим клієнтом перемістити першу клієнтську пряму, і щось подібне до третього клієнта може перемістити перше і друге клієнтське прямо.

У мене виникає питання, як створити справжній Multi-Player? щось на кшталт: Відкрийте три клієнта та перший клієнт отримує rect1, другий rect2 та останній rect3. Перший клієнт може переміщувати лише rect1, третій клієнт може переміщувати тільки rect3.

Може хтось має ідею? Я шукаю в Google, але не знаходжу відповіді.

Вибачте за мою англійську мову, спасибі

Відповіді:


15

Я створив рамку спеціально для створення багатокористувацьких ігор в режимі реального часу HTML5 на основі моделі клієнт / сервер. У цій моделі гравці надсилають на сервер лише вхід (натискаються клавіші) - і гра відбувається на сервері.

Сервер надсилає тимчасові знімки часу з усіма клієнтами, і клієнти самі відтворюють 75 мс назад у поточному часі, знаходячи два відомих світових оновлення, коли їх візуалізація потрапляє між ними.

Репозиторій (містить 3 демонстрації)
https://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs

Демонстрація відео Box2D у дії:
http://vimeo.com/24149718

Слайди JSConf 2011:
http://www.slideshare.net/MarioGonzalez15/realtime-html5-multiplayergameswithnodejs-7868336

Він заснований на інформаційних системах Quakeworld і Valve's Source Engine:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


Вітаємо за цю Рамку!
MrYoshiji

так, так я планую запустити свою гру, має сенс просто надіслати інформацію!
Нікос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.