Benim uygulanması bakmak tavsiye etmemekle birlikte düğümle "multiplayering" genel bir anlayışı işaret olmalıdır.
Ben en basit yaklaşım istemci hem de sunucu üzerinde bir ilişkisel dizi içeren oyuncular (varlıklar) sahip olduğunu düşünüyorum. Daha sonra istemci tarafında
{action: "move", target:[32, 100]}
gibi komutlar gönderiyorsunuz ve bu komutu sunucu mantığıyla (gerçek oyunun çalıştığı yerde) işlemektesiniz. Erişebildiğiniz böylece bir oyuncu nesne veya id atamak gerekir
on connection
her sokete hoşuna: daha sonra
{
timestamp: game.delta,
players: {
1: {x: 32, y: 100},
2: {x: 14, y: 11}
}
}
Ve: Sonra
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();
}
});
her Diyelim ki bağlı tüm oyunculara anlık gönderebilir 100ms diyelim İstemci tarafı veri alır ve eskiden yeni değerlere enterpolasyon yapar.
// 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
}
}
Bu, maksimum 20 nesne ile yarı arcade oyun için yeterli bir algoritmadır. Enstantane aralığının azaltılması, daha fazla nesne ile strateji oyunu için neredeyse uygun hale getirir. Ana düşmanınız, paketin boyutunu küçültebilen bant genişliği kullanımıdır. Örneğin, BiSON, LZW hakkında bilgi edinin ve son anlık görüntüden bu yana değişmeyen verileri göndermeyin.
şöhretim bana tüm bağlantıları yayınlamak için izin vermez, bu yüzden onları burada iliştirilmesi:
http://pastebin.com/Kh3wvF1D
Genel tanıtım Glenn Fiedler tarafından kavramları çok oyunculu:
http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/
Quake'den bazı çok oyunculu teknikler: Bu, hakkında bir ipucu verecektir. nterpolation ve ekstrapolasyon (tahmini)
http://fabiensanglard.net/quakeSource/quakeSourcePrediction.php
gecikme tazminat ve genel optimizasyonlar hakkında Valve'nin madde:
https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Protocol_Design_and_Optimization
Age of Empires
Çok teknikleri:
http://zoo.cs.yale.edu/classes/cs538/readings/papers/terrano_1500arch.pdf#search=%22Real%20time%20strategy%20networking%20lockstep%22
Ayrıca bu bilginin büyük bir kazık var Ivo adlı kişinin Wetzel Mapple.js için bant genişliği kullanımını
http://rezoner.net/minimizing-bandwidth-usage-in-html5-games-using-websocket,299
+1 optimize ilgili yazımda okuyabilirsiniz.
https://github.com/BonsaiDen/Maple.js
Stackoverflow'a Hoş Geldiniz! Çok iyi cevap, böyle devam et ve senin rep eksikliği, çok uzun bir sorun olmamalı. :) – RedRiderX
Böyle detaylı bir açıklama için teşekkür ederim :) – Henryz