Ответ 1
Моя реализация будет очень наивной и упрощенной, без компенсации отставания, экстраполяции и т.д., но она должна указывать на общую концепцию "многопользовательской" работы с node.
Я думаю, что самый простой подход - иметь ассоциативный массив, содержащий игроков (сущностей) как на клиенте, так и на сервере. Затем с клиентской стороны вы отправляете команды типа {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
Общее введение в многопользовательские концепции Гленна Фидлера:
Некоторые многопользовательские методы от Quake: Это даст вам подсказку об интерполяции и экстраполяции (предсказании)
http://fabiensanglard.net/quakeSource/quakeSourcePrediction.php
Статья клапана о компенсации задержек и общих оптимизациях:
Многопользовательские методы в Age of Empires:
Вы также можете прочитать мою статью об оптимизации использования полосы пропускания
http://rezoner.net/minimizing-bandwidth-usage-in-html5-games-using-websocket,299
+1 для Ivo Wetzel Mapple.js это большая куча знаний.