2012-08-06 110 views
2

我是中級經驗的程序員,我想創建一個網絡遊戲。我無法決定我應該爲這款遊戲選擇什麼樣的網絡「模式」。開發網絡遊戲

「模型」是指信息應該從服務器傳輸到客戶端以及處理實際發生的方法。目前,這是我正在考慮的模型:

  • 想象一下,有四個傢伙 - User,John,Bob和Server。服務器是控制遊戲的人。
  • 用戶正坐在他的電腦玩遊戲。他點擊鼠標。
  • John是用戶計算機上檢測鼠標點擊的程序。他不知道這意味着什麼,但他知道他應該把它發給鮑勃。
  • Bob在服務器端。他和約翰一樣,對點擊一無所知,但他知道如何與約翰交流。他拿起鼠標單擊並將其提供給服務器,告訴他它來自用戶。
  • 服務器是大腦。他解釋了鼠標點擊並改變了遊戲中的某些東西。 每個(比如說)30毫秒,服務器渲染遊戲。他知道用戶的相機是指向哪裏,因此他生成的圖像應該出現在用戶的屏幕上。
  • 服務器不知道如何發送給用戶,所以他把它給了鮑勃。 Bob將圖像發送給John。
  • John在屏幕上顯示圖像。

現在,這是一款雙人遊戲,所以我不希望服務器在處理所有用戶請求時遇到問題。我想聽聽你對這個模型的反饋。好嗎?如果不是,還有什麼替代方案?

+0

用戶>約翰>鮑勃>服務器==用戶>程序> API>服務器...是準確的?球員一和二之間的關係是什麼?這是一個連續的遊戲,他們交替作爲用戶(國際象棋)?還是有兩個同時打擊服務器的團體?你如何描述它,它聽起來不像多人遊戲系統 – 2012-08-06 01:45:10

+0

@RobotWoods是的,這是正確的。玩家從不相互溝通。他們只是將輸入發送到生成輸出的服務器並將其返回給每個用戶。它可以與此類論壇進行比較:多個客戶端將其消息發送到服務器,服務器存儲它們並向每個包含所有消息的用戶返回一個HTML文檔。 – user1299784 2012-08-06 02:24:12

+1

在我看來,你的問題的措辭太不精確,無法給出有用的答案。你的問題的大部分包含一個令人費解的例子「模型」,這個例子沒有什麼意義。應該使用的「模型」在很大程度上依賴於您嘗試製作的遊戲類型,並且您沒有提供*有用的*信息。請嘗試修改您的問題,因爲我非常樂意幫助您。 – 2012-08-06 03:22:07

回答

-2

沒有完整的圖片,我想我會建立兩個Web服務,連接到一些數據庫(很可能)。

第一個會接受一些與某些用戶執行的操作相關的參數(點擊座標,時間,用戶ID等),將這些參數保存到數據庫中,然後回覆一些狀態細節(成功,失敗等)。

其他API將接受時間作爲參數,並返回(從JSON或XML格式)自那時以來發生的所有活動(如在聊天程序中...這裏是自上次更新以來的消息)...或者,根據遊戲構造,CUMULATIVE狀態...例如,如果遊戲包含兩個團隊將拼貼從紅色翻轉爲藍色,則此API將返回該拼貼的當前狀態。然後,在客戶端代碼中,我會處理響應以反映該用戶當前的遊戲狀態。

以下是一些示例代碼。這不會自動更新,您可以設置超時以定期輪詢新數據,或設置某種長輪詢(wiki)。哦,因爲這是教育,沒有輸入驗證(除了長度):

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 
<title>Game</title> 
<style> 
html, body {margin:0;padding:0;height:100%;width:100%;} 
#board {width:298px;height:298px;border:thin solid #000;position:relative;} 
#puck {width:58px; height:58px; display:block; background-image:url('al.png'); background-size:contain; position:absolute; top:120px; left:120px;} 
</style> 
</head> 

<body onload="update();"> 
<div id="board"> 
<div id="puck"></div> 
</div> 
<button onclick="update();">Update</button> 
</body> 
<script> 
var x,y; 
document.getElementById('board').addEventListener('click',move); 

function move(e){ 
    a1=((window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP")); 
    x=(e.clientX-29); 
    y=(e.clientY-29); 
    a1.abort(); 
    a1.onreadystatechange=function() 
    { 
     if (a1.readyState==4&&a1.status==200){ 
       document.getElementById('puck').style.left = x+'px'; 
       document.getElementById('puck').style.top= y+'px'; 
     } 
    } 
    params='x='+x+'&y='+y; 
    a1.open("POST","al_accept.php",true); 
    a1.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    a1.setRequestHeader("Content-length", params.length); 
    a1.setRequestHeader("Connection", "close"); 
    a1.send(params); 
} 

function update(){ 
    a2=((window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP")); 
    a2.onreadystatechange=function() 
    { 
     if (a2.readyState==4&&a2.status==200){ 
       res=JSON.parse(a2.responseText) 
       x=res.x; 
       y=res.y; 
       document.getElementById('puck').style.left = x+'px'; 
       document.getElementById('puck').style.top= y+'px'; 
     } 
    } 
    params='x='+x+'&y='+y; 
    a2.open("POST","al_respond.php",true); 
    a2.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    a2.setRequestHeader("Content-length", params.length); 
    a2.setRequestHeader("Connection", "close"); 
    a2.send(params); 

} 
</script> 
</html> 

,你會看到move功能將數據發送到al_accept.php將其存儲(這裏只是寫,因爲每次移動到文件並且update函數調用al_respond.php來檢索最新的數據。

al_accept。PHP:

<?php 
$x=(strlen($_REQUEST['x'])>3)?substr($_REQUEST['x'],0,3):$_REQUEST['x']; 
$y=(strlen($_REQUEST['y'])>3)?substr($_REQUEST['y'],0,3):$_REQUEST['y']; 
$pos=fopen('al.txt','w'); 
$str='{"x":'.$x.',"y":'.$y.'}'; 
fwrite($pos,$str); 
fclose($pos); 
?> 

al_respond.php:

<?php 
header('content-type:application/json'); 
echo file_get_contents('al.txt'); 
?> 

如果你打開這兩臺機器上,你可以在一個移動球,當你在其他更新,你會看到最新的位置(反之亦然)。

+0

請解釋一下,如果你downvote。你是否不同意我試圖回答你認爲是不完整的問題?或不同意我的回答? – 2012-08-06 03:28:31

+0

我都不同意你的回答,並認爲你對不完整問題的回答只會讓提問者感到困惑。你有沒有實施過你描述的系統,或知道它在其他地方實施?這聽起來非常複雜,緩慢,並沒有完全解釋......兩個「網絡服務」?一個「api」的地方?也許我只是不理解你... – 2012-08-06 03:59:20

+0

感謝您的迴應。是的,我混合了API和Web服務,但是,我已經構建了多個(快速)系統。一個具體的例子是基於畫布的繪圖聊天程序。第一個Web服務接受圖像,用戶名和時間戳。圖像保存到服務器,它是文件名,其他參數添加到數據庫中的表中。還有另一種服務,用戶可以調用(再次,使用時間作爲參數)。在數據庫中查詢所有傳入參數的更新條目,然後在客戶端應用程序中使用這些字段來構建更新的聊天記錄 – 2012-08-06 04:04:22

0

你應該完全閱讀關於帝國時代如何工作的整個PDF。這是完全相關的,將有助於闡明你的思想極大:

http://web.cs.wpi.edu/~claypool/courses/4513-B03/slides/BT01.pdf

+0

帝國時代是一個RTS,並且是點對點。 OP明確表示他正在尋找一款客戶端服務器遊戲。這是兩個完全不同的東西。 – 2012-08-06 03:20:58

+0

@ BlueRaja-DannyPflughoeft該文檔描述了對等網絡,但也描述了與客戶機/服務器模型相比的優點/缺點。 '這將有助於澄清你的想法',這仍然是一個真實的陳述。 – sethcall 2012-08-06 03:28:49