沒有完整的圖片,我想我會建立兩個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');
?>
如果你打開這兩臺機器上,你可以在一個移動球,當你在其他更新,你會看到最新的位置(反之亦然)。
用戶>約翰>鮑勃>服務器==用戶>程序> API>服務器...是準確的?球員一和二之間的關係是什麼?這是一個連續的遊戲,他們交替作爲用戶(國際象棋)?還是有兩個同時打擊服務器的團體?你如何描述它,它聽起來不像多人遊戲系統 – 2012-08-06 01:45:10
@RobotWoods是的,這是正確的。玩家從不相互溝通。他們只是將輸入發送到生成輸出的服務器並將其返回給每個用戶。它可以與此類論壇進行比較:多個客戶端將其消息發送到服務器,服務器存儲它們並向每個包含所有消息的用戶返回一個HTML文檔。 – user1299784 2012-08-06 02:24:12
在我看來,你的問題的措辭太不精確,無法給出有用的答案。你的問題的大部分包含一個令人費解的例子「模型」,這個例子沒有什麼意義。應該使用的「模型」在很大程度上依賴於您嘗試製作的遊戲類型,並且您沒有提供*有用的*信息。請嘗試修改您的問題,因爲我非常樂意幫助您。 – 2012-08-06 03:22:07