2013-07-05 67 views
0

我正在寫一個實時的比賽,我沒有任何想法如何使實時的舉動(如MMORPG遊戲)可以實時運行的JavaScript

現在我唯一的代碼新的角色加入到窗戶..

看和plis帶我任何addvice !!! :(

服務器(Socket.io):

var handler = function(req, res) { 
    fs.readFile('./index.html', function (err, data) { 
     if(err) throw err; 
     res.writeHead(200); 
     res.end(data); 
    }); 
} 

var app = require('http').createServer(handler); 
var io = require('socket.io').listen(app); 
var fs = require('fs'); 
var port = 3250; 

app.listen(port); 
var postacie = []; 
var idGenerator = 0; 

// socket.io 
io.sockets.on('connection', function (socket) { 
    var pId = idGenerator++; 
    socket.emit("list", postacie); 

    var postac = createChar(pId); 
    postacie.push(postac); 
    io.sockets.emit("join", postac); 

    socket.on("disconnect", function() 
    { 
     var sId = "character" + pId; 
     for (var i = 0,n=postacie.length; i < n; ++i) { 
      var postac = postacie[i]; 
      if (postac.id == sId) { 
       io.sockets.emit("leave", {id:postac.id}); 
       postacie.splice(i, 1); 
       break; 
      } 
     } 
    }); 

}); 


function createChar(id) 
{ 
    var postac = { 
     src: "http://img703.imageshack.us/img703/1416/2st.gif", 
     id: "character" + id 
    }; 
    return postac; 
} 

客戶:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Real tie game</title> 
     <script src="/socket.io/socket.io.js"></script> 
     <script type="text/javascript"> 
      window.onload = function() { 

       var socket = io.connect('http://localhost:3250'); 

       socket.on("join", function(data) 
       { 
        var element = document.createElement('img'); 
        element.src = data.src; 
        element.id = data.id; 

        var body = document.getElementsByTagName('body')[0]; 
        body.appendChild(element); 

       }); 
       socket.on("list", function(data) 
       { 
        for (var i=0; i < data.length; i++) { 
         var element = document.createElement('img'); 
         element.src = data[i].src; 
         element.id = data[i].id; 

         var body = document.getElementsByTagName('body')[0]; 
         body.appendChild(element); 
        }; 

       }); 
       socket.on("leave", function(data) 
       { 
        var element = document.getElementById(data.id); 
        if (element) 
         element.parentNode.removeChild(element); 
       }); 

      } 
     </script> 
    </head> 
    <body> 

    </body> 
</html> 
+0

是什麼「做出的舉動」是指在這方面?您是在談論在屏幕上製作動畫,還是通過網絡更新相關數據? (或兩者?) – nnnnnn

回答

0

沒有與服務器狀態同步客戶端

兩種常用的方法。所有服務器的第一個應該有循環o在其側面,它將執行遊戲對象的所有更新,移動它們,改變狀態等。這被稱爲update並且存在ups-每秒更新。對於MMO來說,它可以在2-10之間,這取決於你想要的「接近實時」多少。

然後每隔一段時間,不多於ups但可能更罕見,您需要發送狀態到客戶端,與對象的位置。例如,每秒可以完成5次(每200毫秒)。客戶端將不得不插入或外插,它被稱爲dead reckoning

方法將基於事件的,其中服務器將事件發送到客戶端,例如object_1024 moved to x,y,那麼客戶就需要有自己的循環,以便從現在的位置移動對象到新的一個。

如果是遊戲開發的關係,更好地在這裏問:https://gamedev.stackexchange.com/

相關問題