跟大家講解下有關php 網頁游戲開發入門教程一(webgame+design),相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說php 網頁游戲開發入門教程一(webgame+design),小編也收集到了有關php 網頁游戲開發入門教程一(webgame+design)的相關資料,希望大家看到了會喜歡。
一、簡單的程序框架。 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""; $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""; echo""; } } }
復制代碼 代碼如下:
這個是網上找的代碼。稍微修改就可以用的。這里只是顯示了倒計時。也可以改為顯示資源的增加情況。 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()); } m_dbConn.Close(); 定時器的主函數。 void CBeiLiDlg::Go() { while(true) { // AfxMessageBox("go"); Sleep(5*1000);//毫秒。定時器刷新時間。 } }
當然。這里的C的代碼不能直接用。只是一部分。 新的方法是,通過php定時器類負責前臺、時間到后,調用ajax執行完成。后臺通過定時執行php定時器類的專用處理函數,處理前臺掉線,前臺未正常執行等情況。 如果我們的新游戲今年年底能正常上線的話。我可以公開這個類,沒技術含量,但是很巧妙。 地圖、城市、基本上算是有了。 接下來是城市里的建筑。 上面講的資源增加,其實定位在建筑上更準確。不過建筑的分類和數值會復雜很多。那是策劃考慮的問題。 建筑上,只講一個前臺的修建效果。 當然,這個效果是可有可無。你可以直接給個類似新聞列表的顯示,再加個倒計時就行。 顯示的效果就是,點修建后。不刷新頁面,調入一張動畫圖片。并在時間到后自動轉換為其他圖片。 Code復制代碼 代碼如下:
附帶講一下。如果要考慮多瀏覽器兼容,那么用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。會覺得很簡單。大功能其實就那么幾個。思路上也容易繞成圈。 實際情況是,一個非常簡單的功能,當它需要繞圈的時候;當它需要交互的時候。這個功能就不再簡單,而是復雜,相當的復雜。 這是當你不太明白設計模式的時候,如果你精通設計模式,那么功能就會簡單起來。 特別是你想制作一款有足夠的可玩性,能面向市場的產品,即使是初期思路非常簡單,功能也很單純。但你實際策劃的時候,實際編程的時候。大量的數據、數值需要你去處理,大量的交互需要你去處理。這時候,開始的簡單,已經變得復雜了。雖然從程序的角度講,技術含量不高。 更準確的講,是繁瑣,非常繁瑣。 優秀的策劃是可以把數據表列出來,把數據走向清晰的列出來,放在你面前。這樣的策劃不多的。 當然,他不一定列得很準確,但是程序員能比較準確的理解他的意思。來源:php中文網