2013-01-19 51 views
1

我正在使用Canvas和MySQL數據庫在PHP中開發多人遊戲。 兩名球員加入比賽,他們首先得到對手的位置(X,Y和角度)。

準備就緒後,遊戲開始。遊戲Algorthim會這樣。
每50毫秒PHP多人遊戲:數據同步無法正常工作

  1. 計算自己的位置(X,Y)
  2. 獲取對手的角度(AJAX),並計算出對手的POS(X2,Y2)
  3. 畫布和更新然後畫數據庫。

    context.fillStyle = "green"; 
    context.fillRect(p1.x,p1.y, 5,5); 
    addPoints(p1.x,p1.y); 
    updateRoundJQ(p1.x,p1.y,p1.a); 
    
    context.fillStyle = "red"; 
    context.fillRect(x2,y2, 5,5); 
    addPoints(x2,y2); 
    
    loopTimer = setTimeout('drawLine()', 50); 
    

但不幸的是我得到這樣的結果。接收數據有很大的延遲。任何人都可以請幫助我如何擺脫這個偉大的錯誤?這將是非常感謝。

玩家1的屏幕 Player 1 in one computer

玩家2的屏幕 Player 2

+1

看來,阿賈克斯請求搞砸了整個事情。你每隔50毫秒發送一次請求!嘗試提高那個時間,雖然可能不是你喜歡做的事情,但你可以試試websocket來獲得這個「實時」,並特別看看socket.io庫。 – Gntem

+0

@GeoPhoenix我使用getAngle()和updateRound()函數在循環之外並將時間提高到10ms。結果比上面的要好得多。不過,角度的細微差別會產生不同的結果。 –

回答

4

你的腳本不運行每隔50ms - 因爲它是隻設置一次,其他所有功能都運行超時。根據updateRound的工作原理,這可能會增加每個間隔的往返時間。

例如,請考慮下面的時序:

context.fillStyle = "green"; // 1ms 
context.fillRect(p1.x,p1.y, 5,5); // 1ms 
addPoints(p1.x,p1.y); // 1ms 
updateRoundJQ(p1.x,p1.y,p1.a); // web request? 300ms 

context.fillStyle = "red"; // 1ms 
context.fillRect(x2,y2, 5,5); // 1ms 
addPoints(x2,y2); // 1ms 

loopTimer = setTimeout('drawLine()', 50); // wait 50ms from now 

因此,這些例子的時序,你的循環後,才〜306ms運行。

可能值得考慮的是使用websocket將數據推送到客戶端,而不是使用AJAX進行推送。

+0

是的。感謝您的演示。這可能是問題。但我從來沒有使用websockets。你能給我一個鏈接,瞭解websockets嗎? –

+0

https://developer.mozilla.org/en-US/docs/WebSockets –

+0

在所有瀏覽器中都支持Websockets嗎?特別是在IE? –

1

我終於找到了解決方案Node.JSSocket.IO。 解決方案將比AJAX更簡單。

//Client Side Request 
    function sendMyPoints(){ 
     socket.emit('myPoints',p1.x,p1.y); 
    } 

    //Server Handles the Request 
    socket.on('myPoints',function(xP, yP){ 
    socket.broadcast.emit('getOppPoints',xP,yP); 
    }); 

    //Client gets the Response 
    socket.on('getOppPoints',function(xPos,yPos){ 
     drawOppPoints(xPos, yPos); 
    }); 

感謝您提供Websocket。這很棒。