php 網頁遊戲開發入門教程一(webgame+design)_php執行個體

來源:互聯網
上載者:User

一、簡單的程式架構。
webgame程式構成:
三大部分。
第一是資料流程。第二是程式。第三是美術。
其中,資料流程包括了功能。也只有在功能中才能體現資料流程。
資料流程相當的麻煩,後面再討論。
比如最簡單的賣買產品。
要實現這個功能。
那麼需要有產品基礎資料表、產品詳細表、商店表、背包表。如果擴充性更強,相應的雙表是少不不了的。
表的問題都簡單了。關鍵是這個物品有什麼用。這樣物品的來源,一大堆資料,物品的走向,又是一大堆資料。
最後,這些資料得繞成一個圈。
繞圈是一件困難的事情。特別是功能和道具多了起來的時候。難度是2的n次方。

在繞圈之前,如果你比較熟練設計模式。那麼這個過程可以簡化。難度由2的n次方變為1。
只需要有控制器、事件工廠、抽象道具工廠這三個虛類;再加上定時器,任務編輯器,這兩個通用類。即可以構建一個健壯、高擴充的webgame。
在webgame裡控制器幾乎可以等同於頁面。隨便採用一種模板技術即能很方便的處理。
事件工廠是一個抽象類別,所有的事件,如打工、戰鬥、移動等都由事件工廠的生產。並且介面相同,方便控制器控制。原廠模式。
抽象道具工廠是一個抽象類別,所有的道具,如城市、地圖、裝備等,都由抽象道具工廠生產。並且介面相同,原廠模式,事件與道具的結合又是一個橋接模式。

美術:
UI。簡潔漂亮的介面總會有好處。小表徵圖。道具,地圖,裝備。一類至少10個吧?大體上百把個是需要的。
程式分5個部分:
伺服器定時器。(C語言或自己設定伺服器)定時迴圈執行某一段代碼。而這段代碼主要是根據資料庫的資料進行更新。這個可以找個C語言程式員來做。對於C語言程式員來講,這個功能是相當的簡單。當然,具體的處理資料的判斷和操作資料庫,需要你自己寫。讓C語言程式員給你段標準代碼就行了。完全支援sql語句的。
php的話,可以配置corn實現。但是不管是什麼作業系統,配置的時間最低是1分鐘。所以,如果你要處理1秒鐘重新整理一次的情況。你還需要專門的定時器程式來處理,或者被定時執行的php需要包含sleep().當然,即使有即時互動,可以不管伺服器端。只處理互動的雙方的用戶端。js和ajax實現。
功能頁面、功能函數。主要就是資料存取,判斷,資料走向。
用上抽象類別,會比較輕鬆。不過子類的爆炸是少不了的了。
ajax函數。(可選)某些需要偽即時的功能要用到。
為了讓遊戲看起來酷一點。用吧。
javascript函數。(可選)類比用戶端的資料計算。也就是webgame的與時間相關的資料。分為兩部分。一部分是真實資料,是由伺服器端的定時器計算的。另一部分是只有初始值,用戶端顯示用的。不需要即時同步,僅僅需要類比同步就行。
這裡還包括一些漂亮的UI特效。畢竟是遊戲。
資料庫。一大堆基礎資料表和詳細資料表。基礎資料表:比如等級1到等級100的使用者的屬性初始值。詳細資料表:每個使用者的具體屬性。
資料庫上,盡量最佳化。結構上能用1位元組的就別用2位元組。

二、一個詳細的例子。
單純的討論資料流程是件痛苦的事情。
討論程式而不給代碼也是比較痛苦。
這裡用的是php+mysql的。同時,這個例子沒有用到類。如果時間充足的話,今年年底,我會提供一個帶即時互動的簡單webgame代碼和核心類來說明使用了設計模式的好處。
那就按一個超簡單的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。


Code

複製代碼 代碼如下:

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 "<style type="."text"."/"."css>";
$rs=mysql_fetch_array($result);

echo "#map{";
echo "position:absolute;";
echo "width:".$rs[X座標]."px;";
echo "height:".$rs[Y座標]."px;";
echo "z-index:0;";
echo "left:0px;top:0px;}";

}

function Map_bg($Map_ID){

$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 "<div id=Layer_bg_".$rs[X座標]."_".$rs[Y座標].">";
echo "<img src=".$rs[Map_bg]." border=0 title=".$rs[ID]."></div>";

}

}
}


上面是一個很簡單的地圖類。代碼可能不太正確,意思是正確的。就是根據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分鐘吧。當然伺服器夠牛的話,幾秒鐘都可以。)
當然,可以完全php寫,然後配置php的corn。現在我在做的程式就是直接用php寫了。包括任意長時間的定時器類,專門控制抽象事件用的。C的定時器暫時沒用。
每次執行什麼代碼呢?
首先得建立一個定時器任務的表。目的就是讓定時器知道需要執行哪些程式和資料的更新。表內容比如:城市資源更新。當然,這個表可要可不要。建立的好處是方便處理類似保護狀態不產生資源之類的問題。


服務端程式:
獲得當前伺服器時間。
獲得當前需要更新城市。
判斷伺服器時間與$Money_time的時間差。(時間戳記,具體的時間戳記網上資料滿多的。)
判斷時間差是否大於$Action_Time。
大於,則更新資源。同時更新$Money_time。
小於,則無操作。

用戶端程式:
獲得當前伺服器時間。
獲得當前城市的$Money,$Money_time,$Action_Time。
使用javascript顯示剩餘時間的倒計時,以及增加的資源量。

用戶端特殊情況觸發:
因為用戶端顯示的資源情況是偽同步,所以當用戶端使用該資源的時候。需要服務端將當前的實際資源更新,屬於定時器處理的時間也需要更新。
即,當用戶端觸發涉及資源的情況時,立即更新當前資源。同時更新定時器中會用到的$Money_time。這樣才不會造成,看的資源用不到,或者定時器重複產生資源。

總體來說。這部分程式都很簡單。痛點在C語言定時器的製作,以及前台javascipt倒計時的寫法上。
C語言定時器,找個C語言程式員,超簡單;前台的javascipt,網上有很多倒計時的代碼,找個來改改就能用。

Code
複製代碼 代碼如下:

<SCRIPT LANGUAGE="JavaScript">
var maxtime = 這裡是你的時間差///一個小時,按秒計算,自己調整!
function CountDown(){
if(maxtime>=0){
minutes = Math.floor(maxtime/60);
seconds = Math.floor(maxtime%60);
msg = "你的文字說明"+minutes+"分"+seconds+"秒";//動態顯示剩餘時間。
document.all["timer"].innerHTML=msg;
//if(maxtime == 3) document.all["timer"].innerHTML='只剩3秒!';
--maxtime;
}
else{
clearInterval(timer);
document.all["timer"].innerHTML='時間到';
}
}
timer = setInterval("CountDown()",1000);
</SCRIPT>

<div id=timer></div>

這個是網上找的代碼。稍微修改就可以用的。這裡只是顯示了倒計時。也可以改為顯示資源的增加情況。

C語言裡操作mysql資料庫。

Code
複製代碼 代碼如下:

// TODO: Add your control notification handler code here
bool bRes = m_dbConn.Connect("資料庫ip地址", 3306 , "使用者名稱", "密碼", "資料庫名");
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的代碼不能直接用。只是一部分。
新的方法是,通過php定時器類負責前台、時間到後,調用ajax執行完成。後台通過定時執行php定時器類的專用處理函數,處理前台掉線,前台未正常執行等情況。

如果我們的新遊戲今年年底能正常上線的話。我可以公開這個類,沒技術含量,但是很巧妙。

地圖、城市、基本上算是有了。
接下來是城市裡的建築。
上面講的資源增加,其實定位在建築上更準確。不過建築的分類和數值會複雜很多。那是策劃考慮的問題。
建築上,只講一個前台的修建效果。
當然,這個效果是可有可無。你可以直接給個類似新聞列表的顯示,再加個倒計時就行。
顯示的效果就是,點修建後。不重新整理頁面,調入一張動畫圖片。並在時間到後自動轉換為其他圖片。


Code
複製代碼 代碼如下:

<script language='javascript'>
function xiujian()
{
top.abc.document.getElementById('前台建築位置所在圖片的id').src='修建後建築的圖片地址';
//顯示修建後的建築圖片。可以加上後台時間判斷。其中abc,是建築所在層的id,
}
function xiujian1()
{
setTimeout('xiujian()',5000);//動畫時間5秒。這裡也可以加入時間判斷。當時間不到的完成的時候,繼續調用動畫。
}
function donghua()
{
top.abc.document.getElementById('前台建築位置所在圖片的id').src='建築動畫所在的地址';//顯示修建動畫。
}
donghua();
xiujian1();
</script>

附帶講一下。如果要考慮多瀏覽器安全色,那麼用prototype.js。如果只需要ff和ie。那麼用而jqury.js
或盡量自己寫。因為120k的prototype.js不算小。
後台部分,把時間到,增加資源的代碼,改為時間到,增加或更建立築就行了。又是增加N個表。。
新的方法是,增加事件子類。

建築基礎資料表:產出,類型,圖片等等。。
建築詳細表:屬於哪個城市,可以在城市表裡關聯。關聯的方式不同會對程式有很大的影響。各種關聯方式都行,但是一旦關聯方式確定後,最好別改動。
現在建築也有了。用類似的定時方式,打工,徵兵等等都可以實現。
戰鬥,
兵的參數:兵種,數量,攻擊,防禦等等。
戰鬥的暫存資料表:誰的兵,打誰,出發時間,戰鬥時間,戰鬥結果。
這裡的幾個字到是簡單。實際的表會複雜一些。
webgame中,戰鬥的過程分兩種,一種是給出雙方參數,時間到,就根據公式計算結果。一種是半即時或者即時的戰鬥,可以邊打邊喝藥邊用技能的那種。

第一種流程。
點出兵。這時候,兵的參數,出發時間,到達時間,都記錄進戰鬥暫存資料表。
定時器中,處理戰鬥的部分,判斷時間是否到開打的時候。到開打的時間了,則取得被攻擊方的兵的參數。然後通過幾個公式計算結果。處理結果,比如誰的兵掛了多少,戰場掉落了多少錢,城市被誰搶到了。一大堆判斷以及updata。(這裡的定時器處理和獲得資源的定時器處理是很類似的。)
最後把結果分別發給雙方。(又涉及到一個簡訊息系統。)

第二種流程。
點攻擊。馬上就處理資料。打打npc好做。玩家之間對戰,也可以把被攻擊的玩家當成npc來處理。
兩個人或兩人以上即時戰鬥。需要用到ajax了。目前在技術上和理論上是沒問題的,還沒實際寫代碼,所以不好講。

現在,技術上已經確定可以很好的實現了。
很簡單的公式,兩種戰鬥都可以用到:

intval(sqrt($User_B_AP)-sqrt($User_A_DP));
根號下攻擊-根號下防禦=傷害。
具體寫的時候,公式肯定會複雜不少,不過這頭痛的事,還是交給策划去做吧。
戰鬥的具體參數,其實已經不是程式考慮的了。
程式只需要考慮從資料表A取得資料,存入暫存資料表B。然後當時間到了後(通過定時器實現),再從資料表C取得資料,通過公式計算,最後刪除暫存資料表B或者把暫存資料表B存到另外一個地方備份。
這裡的思路其實就是定時器類。
資料是哪些?找策劃要。有幾個表?找策劃要。戰鬥公式?找策劃要。
有地圖、城市、建築、士兵、戰鬥後,道具的出現就有必要了。
為什麼呢?
有了城市能做什嗎?產生資源,產生錢,產生兵。
有了士兵做什嗎?可以搶資源,搶錢。
資源和錢做什嗎?買道具。
買道具做什嗎?更好的搶資源和搶錢。
(同時,搶資源,搶錢的時候,資源會被消耗)
這是一個很簡單的迴圈。就是繞成了一個圈,雖然這個圈很小。有部分策劃想得非常好,就是繞不成圈,那樣沒任何意義。

首先,需要一個道具的基礎資料表。自動ID,道具類型,道具屬性,說明。在道具的處理上,可以在玩家表裡增加更多欄位,道具跟隨玩家。也可以單獨建一個道具的詳細表。用類似背包的方式實現。
背包的方式有兩種,一是用數組儲存,二是用橫向表格儲存體。都挺麻煩的。不過從道具流通和買賣上考慮。用背包的方式是值得的。接下來的功能。
商店。拍賣行。基本上跟一般的網站應用程式很類似。只不過產品變為了遊戲裡的道具。貨幣是遊戲幣。

三、總結
上面的小例子,思路上是基本完善,沒問題的。程式碼上只給了一小部分,能真正理解這一小部分。其他部分的程式應該不是問題。
webgame重要的還是資料流的繞成圈,以及可玩性。
現在講為:程式的健壯和資料流的清晰。
上面的功能,真的做出來,是不夠玩的。就是沒什麼可玩性,做出來都沒意義。
但是,僅僅是做出來,仍然是一件困難的事情。
遊戲裡涉及的東西太多。即使是很簡單的遊戲,即使webgame看上去很簡單,甚至實際也很簡單;做出來,非常困難。
沒有過開發webgame經驗的人,來策劃webgame或者說開發webgame。會覺得很簡單。大功能其實就那麼幾個。思路上也容易繞成圈。
實際情況是,一個非常簡單的功能,當它需要繞圈的時候;當它需要互動的時候。這個功能就不再簡單,而是複雜,相當的複雜。
這是當你不太明白設計模式的時候,如果你精通設計模式,那麼功能就會簡單起來。

特別是你想製作一款有足夠的可玩性,能面向市場的產品,即使是初期思路非常簡單,功能也很單純。但你實際策劃的時候,實際編程的時候。大量的資料、數值需要你去處理,大量的互動需要你去處理。這時候,開始的簡單,已經變得複雜了。雖然從程式的角度講,技術含量不高。
更準確的講,是繁瑣,非常繁瑣。

優秀的策劃是可以把資料表列出來,把資料走向清晰的列出來,放在你面前。這樣的策劃不多的。
當然,他不一定列得很準確,但是程式員能比較準確的理解他的意思。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.