一、簡單的程序框架。webgame程序構成:三大部分。第一是數據流程。第二是程序。第三是美術。其中,數據流程包括了功能。也只有在功能中才能體現數據流程。
數據流程相當的麻煩,後面再討論。比如最簡單的賣買產品。要實現這個功能。那麼需要有產品基礎表、產品詳細表、商店表、揹包表。如果擴展性更強,相應的雙表是少不不了的。表的問題都簡單了。關鍵是這個物品有什麼用。這樣物品的來源,一大堆數據,物品的走向,又是一大堆數據。最後,這些數據得繞成一個圈。繞圈是一件困難的事情。特別是功能和道具多了起來的時候。難度是2的n次方。
美術:
UI。簡潔漂亮的界面總會有好處。
小圖標。道具,地圖,裝備。一類至少10個吧?大體上百把個是需要的。
程序分5個部分:服務器定時器。(C語言或自己設定服務器)定時循環執行某一段代碼。而這段代碼主要是根據數據庫的數據進行更新。這個可以找個C語言程序員來做。對於C語言程序員來講,這個功能是相當的簡單。當然,具體的處理數據的判斷和操作數據庫,需要你自己寫。讓C語言程序員給你段標準代碼就行了。完全支持sql語句的。
功能頁面、功能函數。主要就是數據存取,判斷,數據走向。
ajax函數。(可選)某些需要偽即時的功能要用到。
javascript函數。(可選)模擬客戶端的數據計算。也就是webgame的與時間相關的數據。分為兩部分。一部分是真實數據,是由服務器端的定時器計算的。另一部分是隻有初始值,客戶端顯示用的。不需要即時同步,僅僅需要模擬同步就行。
數據庫。一大堆基礎數據表和詳細數據表。基礎數據表:比如等級1到等級100的用戶的屬性初始值。詳細數據表:每個用戶的具體屬性。
二、一個詳細的例子。
單純的討論數據流程是件痛苦的事情。討論程序而不給代碼也是比較痛苦。這裡用的是php+mysql的。
那就按一個超簡單的webgame的方式來討論。配上適當的代碼。應該有所幫助。不足的地方也請大家指出,對我個人也是幫助。
我們不去考慮遊戲的可玩性,數值平衡等等問題。我們先只考慮一個簡單例子的實現。
那麼一個webgame的基本內容需要些什麼呢?
數據庫:玩家、地圖、城市、建築、武器、士兵。
功能:登陸、升級、個人戰鬥、士兵之間的戰鬥、與城市的戰鬥、修建建築、打造武器、買賣道具。(注意:每一個功能,必然對應1個或多個數據表。上面數據庫中所列的只是基礎中的基礎。)
首先是地圖、城市、建築。這裡認為,地圖可以有多張,城市在地圖上,建築在城市內。
地圖表Map :Map_ID ,X座標,
Y座標,City_ID(城市ID),描述。其中Map_ID是指地圖的id。不是自動編號。一張地圖就是一個Map_ID,可以重複。
城市表City:City_ID,城市名字,城市所有人,城市等級,城市資源,描述。
建築表Build:ID,City_ID,建築名稱,建築等級,建築功能。
其中,地圖表確定城市的位置,城市表確定城市的相關數據以及所有人,建築表內的多條信息屬於某一個城市。
建表後,顯示出來。一個for循環。把地圖表整個取出來就ok。跟普通網站的新聞列表沒太大區別。不同的是,你需要取得X座標和Y座標定位。可以用tabel也可以用div。
class Map//地圖類{var $Map_ID;function
Map_bg_css($Map_ID) {
$this->Map_ID = $Map_ID;mysql_select_db($db_name,$link);$sql=”select * from map where
Map_ID=’”.$this->Map_ID.”‘ limit 1″; $result=mysql_query($sql,$link); echo “
$this->Map_ID = $Map_ID;$sql=”select * from map where Map_ID=’”.$this->Map_ID.”‘”; $result=mysql_query($sql,$link);while($rs=mysql_fetch_array($result)){ echo “
“ title=”.$rs[ID].”>
上面是一個很簡單的地圖類。代碼可能不太正確,意思是正確的。就是根據map表中的座標,生成了一組div層,以及這一組層的css。你可以改為table的。你可以也把座標放到一個字段裡,用數組的形式取。
使用的時候,用
new map;map(N);
其中N是map表裡的地圖Map_ID.
城市內的建築也類似。如果要顯示出來的話。
有了地圖和城市後。
涉及到的問題就是城市裡資源的產生。
這時候,City表裡需要有可供判斷的時間和數量的字段。比如:產生資金量Money,產生資金花費的時間Action_Time,上次產生資金時間Money_time。
這兩個字段的數值應該在City_base表裡出現。(即城市基礎表,不同等級,不同類型城市的對應數值。這是給策劃填數據用的,建好表後就等策劃去頭痛吧。如果你身兼數職。。。)
如何自動產生資源呢?
我們可以在城市所有人改變的時候,寫入一個時間。或者在城市初始化的時候寫入一個時間。
$Now_Time=date(’Y-m-d H:i:s’);
(說明:$開頭是變量的意思。php裡特有的。如果是asp的話可以寫成。Now_Time=Now()
)
把$Now_Time寫入到Money_time裡。
update(”UPDATE City SET Money_time=’$Now_Time
WHERE City_ID=’$City_ID’ LIMIT 1;”);
$City_ID是你自己定義的。指某一個城市。如:$City_ID=1;
我們假定當前城市產生資金量為100。即$Money=100;(具體的數值,應該是由City_base表裡取出的。)
假設間隔時間為$Action_Time,我們再假定是每小時執行一次。即$Action_Time=3600;(具體的數值,是根據你的初始化表裡取得的。也可以根據城市等級或者用戶等級取得。反正隨便你自己怎麼設定。)
這時候,有基礎時間了。有基礎資金產量了。有間隔時間了。
讓它循環執行起來就行了。
上面說過,服務端用C語言定時器。客戶端用javascript。
服務端,資源定時器設定為5分鐘執行一次。那麼我們的誤差就是5分鐘。對網頁遊戲來說,可以接受。(戰鬥的定時器得1分鐘吧。當然服務器夠牛的話,幾秒鐘都可以。)
每次執行什麼代碼呢?
首先得新建一個定時器任務的表。目的就是讓定時器知道需要執行哪些程序和數據的更新。表內容比如:城市資源更新。當然,這個表可要可不要。建立的好處是方便處理類似保護狀態不產生資源之類的問題。
服務端程序:
獲得當前服務器時間。
獲得當前需要更新城市。
判斷服務器時間與$Money_time的時間差。(時間戳,具體的時間戳網上資料滿多的。)
判斷時間差是否大於$Action_Time。
大於,則更新資源。同時更新$Money_time。小於,則無操作。
客戶端程序:
獲得當前服務器時間。
獲得當前城市的$Money,$Money_time,$Action_Time。
使用javascript顯示剩餘時間的倒計時,以及增加的資源量。
客戶端特殊情況觸發:因為客戶端顯示的資源情況是偽同步,所以當客戶端使用該資源的時候。需要服務端將當前的實際資源更新,屬於定時器處理的時間也需要更新。即,當客戶端觸發涉及資源的情況時,立即更新當前資源。同時更新定時器中會用到的$Money_time。這樣才不會造成,看的資源用不到,或者定時器重複產生資源。
總體來說。這部分程序都很簡單。難點在C語言定時器的製作,以及前臺javascipt倒計時的寫法上。
C語言定時器,找個C語言程序員,超簡單;前臺的javascipt,網上有很多倒計時的代碼,找個來改改就能用。
這個是網上找的代碼。稍微修改就可以用的。這裡只是顯示了倒計時。也可以改為顯示資源的增加情況。
C語言裡操作mysql數據庫。
// TODO: Add your control notification handler
code herebool bRes = m_dbConn.Connect(”數據庫ip地址”, 3306 , “用戶名”,
“[[email protected]#ghj]密碼[/email]“, “數據庫名”);
if(!bRes){AfxMessageBox(”connect fail”);return;}
string strSql = “select * from city limit
1″;//所有顯示或取值類的都用這段。中間的sql語句可以自己構造。ResultSet* rs =
m_dbConn.ExecuteQuery(strSql);while(rs->Next()){string str =
rs->GetString(”username”);AfxMessageBox(str.c_str());}/*strSql
= “update city set money=money +100 where
City_ID=’xxx’”;//所有的增加、刪除、更新都用這段,中間的sql語句可以自己構造。
bRes = m_dbConn.ExecuteUpdate(strSql);
if(!bRes){AfxMessageBox(”ExecuteUpdate
fail”);}*/m_dbConn.Close();
定時器的主函數。void
CBeiLiDlg::Go(){while(true){//
AfxMessageBox(”go”);Sleep(5*1000);//毫秒。定時器刷新時間。}}//相當的簡單..。
當然。這裡的C的代碼不能直接用。只是一部分。
地圖、城市、基本上算是有了。
接下來是城市裡的建築。
上面講的資源增加,其實定位在建築上更準確。不過建築的分類和數值會複雜很多。那是策劃考慮的問題。
建築上,只講一個前臺的修建效果。
當然,這個效果是可有可無。你可以直接給個類似新聞列表的顯示,再加個倒計時就行。顯示的效果就是,點修建後。不刷新頁面,調入一張動畫圖片。並在時間到後自動轉換為其他圖片。
後臺部分,把時間到增加資源的代碼改為時間到增加或更新建築就行了。又是增加N個表。。
建築基礎表:產出,類型,圖片等等。。建築詳細表:屬於哪個城市,可以在城市表裡關聯。關聯的方式不同會對程序有很大的影響。各種關聯方式都行,但是一旦關聯方式確定後,最好別改動。
現在建築也有了。用類似的定時方式,打工,徵兵等等都可以實現。
戰鬥,兵的參數:兵種,數量,攻擊,防禦等等。
戰鬥的臨時表:誰的兵,打誰,出發時間,戰鬥時間,戰鬥結果。
這裡的幾個字到是簡單。實際的表會複雜一些。
webgame中,戰鬥的過程分兩種,
一種是給出雙方參數,時間到,就根據公式計算結果。
一種是半即時或者即時的戰鬥,可以邊打邊喝藥邊用技能的那種。
第一種流程。
點出兵。這時候,兵的參數,出發時間,到達時間,都記錄進戰鬥臨時表。
定時器中,處理戰鬥的部分,判斷時間是否到開打的時候。到開打的時間了,則取得被攻擊方的兵的參數。然後通過幾個公式計算結果。處理結果,比如誰的兵掛了多少,戰場掉落了多少錢,城市被誰搶到了。一大堆判斷以及updata。(這裡的定時器處理和獲得資源的定時器處理是很類似的。)
最後把結果分別發給雙方。(又涉及到一個短信息系統。)
第二種流程。
點攻擊。馬上就處理數據。打打npc好做。玩家之間對戰,也可以把被攻擊的玩家當成npc來處理。
兩個人或兩人以上即時戰鬥。需要用到ajax了。目前在技術上和理論上是沒問題的,還沒實際寫代碼,所以不好講。
很簡單的公式,兩種戰鬥都可以用到:
intval(sqrt($User_B_AP)-sqrt($User_A_DP));
根號下攻擊-根號下防禦=傷害。
具體寫的時候,公式肯定會複雜不少,不過這頭痛的事,還是交給策劃去做吧。