Моя реализация будет очень наивной и упрощенной, без компенсации отставания, экстраполяции и тому подобного, но она должна указывать на общую концепцию «многопользовательской игры» с узлом.
Я думаю, что самый простой подход - это иметь ассоциативный массив, содержащий игроков (сущностей) как на клиенте, так и на сервере. Затем со стороны клиента вы отправляете команды типа {action: "move", target:[32, 100]}
и обрабатываете эту команду с помощью серверной логики (где работает настоящая игра). Каждому сокету on connection
вы должны назначить объект игрока или идентификатор, чтобы вы могли получить к нему доступ, например:
var lastPlayerID = 0;
var players = {};
server.on("connection", function(socket) {
var newcommer = new Player({id: lastPlayerID});
players[lastPlayerID] = newcommer;
socket.player = newcommer; // or lastPlayerID
lastPlayerID++;
socket.onMessage = function(message) {
this.player.doSomething();
}
});
Затем, скажем, каждые 100 мс можно отправить снимки всем подключенным игрокам:
{
timestamp: game.delta,
players: {
1: {x: 32, y: 100},
2: {x: 14, y: 11}
}
}
А затем на стороне клиента получают данные и интерполируют из старых в новые значения.
// duration in this simplified example is snapshot sending interval in [ms]
Player.prototype.interpolateTo = function(data, duration) {
if(typeof data.x != "undefined") {
// step needed to get `destination x` within `duration` miliseconds
this.stepValues.x = Math.abs(data.x - this.x) / duration;
this.target.x = data.x;
}
// ...
}
// step you call for each game loop iteration
Player.prototype.step = function(delta) {
if(this.x < this.target.x) {
this.x += delta * this.stepValues.x
}
}
Это достаточный алгоритм для полу-аркадной игры с максимум 20 объектами. Уменьшение интервала снимка делает его практически подходящим для стратегической игры с большим количеством объектов. Ваш главный враг - использование полосы пропускания, которое вы можете уменьшить, уменьшив размер пакета. Например, прочитайте о BiSON, LZW и не отправляйте данные, которые не изменились с момента последнего снимка.
Моя репутация не позволяет мне публиковать все ссылки, поэтому я прикрепил их здесь:
http://pastebin.com/Kh3wvF1D
Общее введение в многопользовательские концепции Гленна Фидлера:
http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/
Некоторые многопользовательские приемы от Quake:
Это даст вам подсказку об интерполяции и экстраполяции (прогноз)
http://fabiensanglard.net/quakeSource/quakeSourcePrediction.php
Статья Valve о компенсации задержки и общих оптимизациях:
https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Protocol_Design_and_Optimization
Многопользовательские приемы в Age of Empires:
http://zoo.cs.yale.edu/classes/cs538/readings/papers/terrano_1500arch.pdf#search=%22Real%20time%20strategy%20networking%20lockstep%22
Вы также можете прочитать мою статью об оптимизации использования полосы пропускания
http://rezoner.net/minimizing-bandwidth-usage-in-html5-games-using-websocket,299
+ 1 для Ivo's Wetzel Mapple.js - это большая куча знаний.
https://github.com/BonsaiDen/Maple.js