自製WebGame相關技術閒聊

製作Webgame技術交流、Webgame相關程式功能改造、中文化技巧等相關討論。

版主: Mr.Simon, 涅魂, 小剎, BSM

znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

自製WebGame相關技術閒聊

文章znn » 2013-07-31 5:37 pm

說閒聊是想比討論兩字來輕鬆一點

目前我也正在開發一款遊戲,分享一下自己所使用到的一些「東東」

網站主體
要有一台Server,Server的好壞自你的程式效/耗能及玩家的多少
Server的來源有兩個,一個是找外面的空間,一個是自己架
我是選擇自己架,所以要有以下注意的
1.申請自己的Domain Name,這個就是人家要到你網站的網址
2.申請可以有固定IP的網路
3.選擇一個有網域名稱轉址服務的公司設定你申請的Domain Name是對的那個固定IP(不建議自已架Domain Server)
4.安裝Linux系統,找個最穩定的版本來裝,所以你要會Linux(不建議Microsoft Server,要錢)
5.安裝/設定Apache,找個穩的版本安裝
6.安裝/設定MySql,找個穩的版本安裝
7.安裝/設定PHP,找個穩的版本安裝
8.開放SSH Service,未來上傳/下載資料用
9.把Linux的安全性加強,一堆用不到的Service不要開,用不到的Port也不要開
10.在硬體端(分享器等)就先把用不到的Port擋掉,雙重保險

光是網站主體要架起來就到相當的技術能力,如果真的沒法子學,就花錢找空間,不要找免費的

開發相關技術
1.主語言用PHP,你要用Java Servlet也可以,看你專長
2.DataBase上面有說了,用MySql就好
3.JavaScript要會,你可以選用jQuery之類的JavaScript框架,但我選擇全部自己寫,要注意最好用到的JavaScript可以所有WebBroswer都可用
4.CSS要會,要注意最好用到的CSS可以所有WebBroswer都可用
5.HTML一樣,現在可以選用HTML5,但注意先避開有些WebBroswer不支援某些HTML5 Tag
6.最好要會用Ajax跟Json來傳/接資料,這樣的開發可以省下很多流量

目前先寫到這邊,因為要下班了...
接下來還會閒聊OOP<->Function還有MVC/MVP/PHP Framework


最後由 ETERNAL 於 2013-08-06 5:19 pm 編輯,總共編輯了 1 次。
理由: 幫你置頂起來


ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 自製WebGame相關技術閒聊

文章ETERNAL » 2013-07-31 6:04 pm

你要自己寫web game了 ? :mrgreen:


水色論壇 http://www.et99.net
簡恩峻分享

znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-07-31 11:03 pm

對呀,之前就在寫,但停了一陣子
現在又重新寫一次XD



znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-01 11:14 pm

接下來談談OOP物件導向設技跟原傳統結構化語言開發

在網路上有很多的爭論
這個該規劃OO還是用function就好?
其實在爭論中已經有不少人說出了「答案」

先說說這兩種開發型態上的差別跟優缺

物件導向
好處是程式依照功能來分類開發
在維護上可以依照一定的規範來修改使用
壞處是程式有一定的規範,所以你在使用前要先了解物件的用法
另外還有資源的耗損大部份的情況之下較多

結構化語言
開發直覺,上手快,速度跟資源相對快及少
缺點是整體架構相對鬆散,維護上也較不容

以上大概粗略帶過優缺點
要了解詳細的可以去Google找
但都不是絕對的(最後結論會說)
對我來說這兩種開發方法沒有太大的衝突,只有效益上的選擇
對整個專案來看,不是二選一個問題
不是決定用OO就全只能用OO
也不是決定用傳統寫法就完全不用OO

但為什麼有很多開放源碼的框架都會用到大量的OO來開發
一堆大型專案也都選用盡量偏向OO來開發?

因為有一些缺點是可以靠錢來克服
如我用了一大堆OO,New了一大堆元件
系統就比較吃資源,但大公司錢多可以買RAM可以用高檔的Server
但如果你不是,那最好適當的物件化,不要什麼都開個Class,然後一路繼承下去

為什麼Web Game有分Server1 Server2然後一路開下去一大堆Server?
就是因為每台Server資源都有限,你的遊戲越吃資源
相對每台Server可以容納的人數就越少
當然有不少公司也利用這點,Server快滿了就重開一服
新服要玩大家都重來,一方面來不及參與舊服的玩家可以有機會在新服當頭
一方面新服大家沒資源,為了搶先大家比較願意投資一些台幣
有點扯遠了,但多Server也是可以全帳號在一起

通常要選擇怎麼開發
只能靠經驗還有功用來決定
功用是什麼意思?
就是你開發是為了要開源,那最好是用OO
如果是要自用,最好是知道你的Server的能耐加上可以估出人數
在OO跟效能上找到一個自己能力範圍內的平衡點

最後結論
這個算是開發者個人意識上的選擇
不一樣的作業環境下都會影響結果
只能說你對於OO的了解跟你對系統還有開發及作業環境的了解都影響同一功能在兩者之間的選擇
如果你是多人開發大概也沒得選,幾乎都選向OO化
因為多人開發就是要有錢,有錢就是不怕買Server,跟買Server比人力的維護成本已不算什麼
但如果你是個人自製,只能說經驗決定一切
(結論就是我上面說的都是廢話...)



znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-05 10:53 am

再來說說MVC/MVP
如果不懂的人可以先上Google查查
MVC只是一個架構
原本應用在系統應用程式上
後來流傳在Web之前
但充其量就是想把顯示、邏輯/資料及控制分開來
MVC架講的寫法是個趨勢
但用MVP的架講來寫也是可以
看你的Web形態是如何

很多人一開始在接觸MVC會搞得亂七八糟
Model該放那些東西?
View拿來顯示還是控制顯示,控制顯示不就跟Controller的控制重複?
Controller控制是在控制什麼?User Request資料的判斷要寫在Model還是Controller?
真的會有一大堆的問號

例如玩家登入遊戲的流程
玩家輸入UserID及Password
這兩個當然就是Controller來接收
但第一層判斷UserID及Password有沒有值
是要寫在Controller還是Model中?

當然,UserID及Password都必需要有值
而依PHP來說大都用Post來傳這兩個值
所以我的做法會是在Controller把這兩個值用$_POST接收後
先判斷$_POST['UserID']存不存在,如果不存在就提供''空值
isset($_POST['UserID']) ? strtolower($_POST['UserID']) : ''
在Controller中先處理掉User Request格式上的一些問題
然後再把UserID傳到Medol已寫好的checkLogin($userid,$password)中
而userid跟password是不是空的就由checkLogin中來判斷
只要有認何錯誤就是丟出Exception給Controller來處理

而Controller接收到錯誤後要如果顯示給User就由View來處理
例如我要直接顯示錯誤的html,就由顯示html的View來輸出
或是我是用Ajax以JSON的格式來傳資料給User,就由json的View來輸出

上面這斷如果對MVC架構不了解的人大概不會知道我在說什麼
所以重點是先去了解MVC,然後再來實作看看才會有感覺

而MVP跟MVC 差不多,可以看看這文章http://blog.sanc.idv.tw/2011/09/uimvp-passive-view.html

如果沒有經驗
一開始你在架構自己的MVC時會腦子空空不知怎麼下手
就算網路上的範例看得懂
但實際應用在自己開發的遊戲上會有一大段的落
主要是思維不一樣,很多事原本很簡單的處理方法
變成非要繞在東再繞回西
這也是一開始在物件化一些程式時會遇到的一樣問題

但當時間跟思考模式慢慢熟悉這樣的架構
加上經驗的累積,未來在修改上跟開發上會加速很多



znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-05 11:28 am

再來說說PHP Framework
PHP Framework上有很多Framework
都滿合快速或方便架站
但本人是認為都不適合架遊戲
最主要是因為效能還有架構不合用

效能的問題對一般一頁換一頁的網站來說也許不會那麼在意
但如果你要開發遊戲,建議不要用一頁換一頁的方法來做

什麼是一頁換一頁,就是每一頁都是到Server重抓資料
雖然js css都有cache,但動態的html就沒有了

例如你要寫一個看角色基本資料的頁面,你會怎麼做?
layout一個頁面,在上面排好角色資料,然後client要看就顯示給他們看
大家看看以下的範例,一般就是先把html的部份分離成版型(template)
代碼: 選擇全部
chara_status.tpl.php
<table border="1" width="100%" id="chara_status">
   <tr>
      <td>
      <img border="0" src="photo.jpg" width="329" height="264"></td>
      <td>名稱:<?php echo $chara['name']</td>
   </tr>
   <tr>
      <td>力量:<?php echo $chara['power']</td>
      <td>HP:<?php echo $chara['hp']/<?php echo $chara['maxhp']</td>
   </tr>
   <tr>
      <td>速度:<?php echo $chara['speed']</td>
      <td>MP:<?php echo $chara['mp']/<?php echo $chara['maxmp']</td>
   </tr>
   <tr>
      <td>防禦:<?php echo $chara['def']</td>
      <td>Gold:<?php echo $chara['gold']</td>
   </tr>
</table>

然後抓取chara_status.tpl.php這版型
把$chara丟進去,然後用html的方法顯示出來
代碼: 選擇全部
Controller
//這是玩家跟Controller要求showstatus的方法
function showstatus(){
   $id = $SESSION['id'];
   $chara = new chara($id);  //Model有個chara的class,丟入id可以傳回chara的資料
   $hv = new htmlView();     //呼叫View層的顯示html元件
   $hv->setdata($chara);     //把$chara的資料傳到htmlView元件中
   $hv->out('chara_status.tpl.php');  //把資料套到chara_staus.tpl.php版型中,然後回傳到Client端
}


以上是一般網頁的作法
但這樣每次讀都要重傳一堆的table tr td,而且如果你要把它顯式成手機版,是不是又要改寫chara_status.tpl.php
讓它可以合手機大小的頁面輸出?

所以一般的Server MVC架構上
htmlView應用在遊戲說明上算OK
但在遊戲中,View的選用上最好不要用到html來直接傳送玩家要看到的資料


接下來會介紹個人建議用的方法
這篇其實是要說PHP Framework
但一開頭就被我打槍了,所以也沒什麼好介紹
重點就是寫Web Game的門檻本來就比較高
你越依賴的框架越多,可以掌握的東西就相對變少
除非你有能力把一個人家發佈的框架精修成這個遊戲合用的
沒必要的物件跟呼叫還有設定都精簡
如果有這樣的能力,真的不如寫出自己的遊戲框架

自從Google把Ajax發揚光大後
讓User的介面操作可以越來越貼近應用程式
這也影響了我對Web Game遊戲介面及Server端程式的看法



znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-05 1:27 pm

再說說我選擇的遊戲前端架構前
先說說一般線上遊戲的架構

一般線上遊戲都會有所謂的Client端程式
Client端程式是決定這個遊戲是3D、2D、手機、Flash那一類的關鍵
Flash Game 就是用Flash把前端開發的美美的
但資料的傳送也是回到Server端來進行判斷
手機遊戲如最近熱門的神魔之塔也是如果
它的客戶端用各版手機的開發系統來進行開發
但資料最後回到Server

那Web Game呢?
我上篇有提到,一般Web Game都是一頁換一頁
這幾乎沒有所謂的前端程式
你硬要說有前端程式,那就是WebBroswer
但對我來說Web Game還是要有前端程式才對
一般線上遊戲前端多用C Java VB Flash有的沒的程式語言來開發
用C
那C就是基礎前端語言,那要開發3D就會用某個3D引擎
用Flash
那actionscript就是基礎前端語言,要介面就用Flash自帶編輯器來做

Web Game?
Web Game個人建議用Javascript
介面的顯示當然就是HTML及CSS配合
目前不建議用HTML5 Canvas
你要用也可以,但可能會累死你,不然就是找好用的模組來
一人開發要學的東西真的太多了

再來資料傳輸上,Web是無狀態的
不像一般的線上遊戲可以用socks來傳送資料
所以我們選用跟Google一樣的Ajax方法來傳資料
它的好處是不用跳頁就可以傳/收資料
Ajax只是傳/接資料的應用,本身沒有什麼大多的技術性
我記得之前剛要接觸學習Ajax,花不到一天就搞懂它是在做什麼的
只是要真的實作就要Server程式跟前端程式的配合

Ajax只提供一個資料傳送的方法
但資料要依那一種格式來傳又是一個選擇性的問題
個人是不喜愛XML,因為一堆Tag很占頻寬
所以選用json
在遊戲的傳收分析上,因為每次的資料跟你用html直接傳已經差很多
所以也沒必要非要壓縮後再來傳,這樣反而浪費Server端的資源多了一道壓縮程序

在利用Ajax接收到Server端的資料後
利用JavaScript分析JSON資料內容,然後做出相對印的一些動作
這就是我預想出來的一個Client介面流程
在版型的部份會在登入遊戲後一次全載入(資料不會太多)

所以回到上一篇在Server不直接傳html
我們改用傳JSON

下面的版型,原本直接帶值,現在全用div設id,到時接收到資料時就用javascript DOM來設定
而這個版型在一開始登入遊戲後就載入
代碼: 選擇全部
chara_status.tpl.php
<table border="1" width="100%" id="chara_status">
   <tr>
      <td>
      <img id="chara_photo" border="0" src="photo.jpg" width="329" height="264"></td>
      <td>名稱:<div id="chara_name"></div></td>
   </tr>
   <tr>
      <td>力量:<div id="chara_power"></div></td>
      <td>HP:<div id="chara_hp"></div>/<div id="chara_maxhp"></div></td>
   </tr>
   <tr>
      <td>速度:<div id="chara_speed"></div></td>
      <td>MP:<div id="chara_mp"></div>/<div id="chara_maxmp"></div></td>
   </tr>
   <tr>
      <td>防禦:<div id="chara_def"></div></td>
      <td>Gold:<div id="chara_gold"></div></td>
   </tr>
</table>


接下來在Server的Controller把htmlView改用JsonView
代碼: 選擇全部
Controller
//這是玩家跟Controller要求showstatus的方法
function showstatus(){
   $id = $SESSION['id'];
   $chara = new chara($id);  //Model有個chara的class,丟入id可以傳回chara的資料
   $jv = new jsonView();     //呼叫View層的顯示json元件
   $jv->setdata($chara);     //把$chara的資料傳到jsonView元件中
   $jv->out();  //把資料組成json格式直接傳送出去
}


最後在Client的javascript用Ajax的方法進行傳送接收跟顯示資料
代碼: 選擇全部
//JavaScript
//取後XMLHttpRequest元件
var xmlHttp=GetXmlHttpObject();
function GetXmlHttpObject(){
   var xmlHttp=null;
   try
     {
     // Firefox, Opera 8.0+, Safari
     xmlHttp=new XMLHttpRequest();
     }
   catch (e)
     {
     // Internet Explorer
     try
       {
       xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
       }
     catch (e2)
       {
       xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
       }
     }
   return xmlHttp;
}

//ajax function傳入url那個Controller,act什麼動作
function ajax(url,act){
   if (xmlHttp==null){
      alert ("Your browser does not support AJAX!");
      return;
   }
   sid=Math.random();
   var param='';
   url += '.php';   
     var spage='';
   param='act='+act+cmd+"&sid="+sid;
   xmlHttp.onreadystatechange=function(){
                //當Server回傳資料後
      if(xmlHttp.readyState==4 && xmlHttp.status==200){
                        //取得回傳資料
         var d = xmlHttp.responseText;
                        //把回傳資料格式化成JSON格式
              var json = JSON.parse(d);
                        //把資料放到相關的HTML ID中
         document.getElementById('chara_name').innerHTML=d.chara_name;
         document.getElementById('chara_hp').innerHTML=d.chara_hp;
         document.getElementById('chara_maxhp').innerHTML=d.chara_maxhp;
         document.getElementById('chara_photo').src=d.chara_photo;
                        ..............
                        ..............
      }
      else if(xmlHttp.readyState==2)
      {
      }
   }
 
   if (url != '') {
                //用POST的方法把指令丟回Server
      xmlHttp.open("POST",url,true);
      xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      xmlHttp.send(param);
   }
 
}
//到Server的Controller.php中的showstatus取資料
ajax('Controller.php','showstatus');


以上是多了一些步驟
可是真的把資料跟版型分離了
未來如果有Layout 手機版的畫面,Server端幾乎不用動,只要把template修改成手機版型就可以了

另外我這沒有選用jQuery
單純是我不喜歡被框架綁著
jQuery是Javascript的框架之一
jQuery也有提供不少的layout
如jQuery Mobile可以應用在手機上算是方便
但看到一堆css語法上不相容的警示
對我而言不太可以接受

各位有興趣可以安裝FireFox
隨便進入一個網站,按一下Ctrl + Shift + J
都會出現一大堆警示




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 自製WebGame相關技術閒聊

文章ETERNAL » 2013-08-06 5:21 pm

幫你鼎到最前面去了 :mrgreen:


水色論壇 http://www.et99.net
簡恩峻分享

znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-08 1:29 pm

感謝XD
只是越寫越心虛

最近網站先是被入侵
後來重灌打開沒跑滿兩天現在掛了
今天回去才能確定原因
要維護網站的安全真的不太容易

不過也讓我學到不少的東西
只是苦了玩家又要等一下XD




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 自製WebGame相關技術閒聊

文章ETERNAL » 2013-08-08 6:02 pm

znn 寫:感謝XD
只是越寫越心虛

最近網站先是被入侵
後來重灌打開沒跑滿兩天現在掛了
今天回去才能確定原因
要維護網站的安全真的不太容易

不過也讓我學到不少的東西
只是苦了玩家又要等一下XD


哈哈 當作學習經驗吧

我也是過來人,以前也被入侵過 :mrgreen:


水色論壇 http://www.et99.net
簡恩峻分享

znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-10 11:57 am

哈哈
最近被這樣攻擊跟入侵很有感觸
一般沒有高級設備被人盯上真的只能兩手一攤

就順便分享一下最近被入侵還有攻擊的心得
我想很少會有人願意分享,因為這不是什麼光彩的事

原本網站運作都算正常
這篇文章Post出來後當天回家發現Server掛了

用ssh登入root都不行,當下只有兩個可能,一個是HD掛了某些磁區,一個是被入侵改密碼了

兩個都不是什麼好狀況

然後用single mode進入後修改好密碼也發現passwd被人改過

也確定是被入侵了

經過幾天的分析也大概知道要如何"降低"被人用root入侵的相關設定

首先是ssh的設定,要讓root無法直接登入,然後建一個一般user帳號讓這個帳號可以由ssh登入
#vi /etc/ssh/sshd_config
改以下設定
#Root無法登入
PermitRootLogin no
#密碼不可空白
PermitEmptyPasswords no

登入後要用root再su就好了

接下來是ssh預設port的修改
修改方法Google很多,但要注意SELinux要開啟,iptables也要開啟
iptables
#vi /etc/sysconfig/iptables
加入
-A INPUT -p tcp -m state --state NEW -m tcp --dport [你的新Port] -j ACCEPT
#service iptables restart

SELinux
#semanage port -a -t ssh_port_t -p tcp [你的新Port]

然後還有如果你要用sftp上傳你的程式,但怕人家得到這組帳密後sftp到處跑
那也要另外為sftp目錄進行限定
這個可以另寫一篇了,google上有,但要注意SELinux的設定
這是Google上的教學沒有人提到的,我被SELinux卡了幾天,下面會再提到

再來就是防止對方一直暴力猜user的密碼

這個我是交給fail2ban來做,有keyword大家可以上Google查一查

然後安裝了比較新版的Linux系統,我是選用CentOS 6.4 64bit

因為有內建SELinux,一開始不知道,所以搞得自己被綁東綁西的

總之要先了解SELinux,一樣上Google去查,知道它是做什麼就知道為什麼大部份你的設定出問題就是因為有它= =

我是用apache+php5+mysql5
這三個設定後幾乎都跟SELinux設定有關

apache是目錄的問題
如果你有下載phpMyAdmin
wget壓縮檔後要解到apache的www目錄下執行
你會發現開啟網頁後跟你說沒權讀取
#ls -Z
自己去下指令看看,如果沒有-Z就達示你可能沒有SELinux,那就沒什麼問題,只是單純讀寫或user:group問題

那是因為你下載的目錄沒有在SELinux指派讓apache(httpd)這個serivce可以有讀取的權限
最快的設定方法就是移到www目錄後
#cd /var/www
#restorecon -R -v phpMyAdmin
這就是把phpMyAdmin及子目錄下所有的SELinux目錄權限套用跟它的上層目錄(/var/www)一樣

再來你php如果要用php facebook api連facebook當驗證,點了loginurl永遠都不會驗證,getUser()都是0
那又是因為SELinux沒有允許apache(httpd)有連到它網的功能,所以也要開啟
#setsebool -P httpd_can_network_connect 1
1就是啟用0就是停用

mysql,如果你要修改port,修改預設目錄,一樣SELinux也都要進行相對的修改

最後就是最近一直被DoS/DDoS攻擊
這攻擊會讓你Server最後沒有回應
這部也份也是目前我最頭痛了
裝了apache的mod_evasive只能快速知到那個IP在DoS攻擊
老實說沒什麼用,因為知道了mod_evasive也無法擋住DoS的攻擊
系統一段時間很一樣掛,而且它只針對apache的偵測

接下來的防範我還沒實作,所以就先不說了,等有效有沒效再來分享= =




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 自製WebGame相關技術閒聊

文章ETERNAL » 2013-08-15 1:35 pm

我們這種自己架設網站,能做到的防護有限

能做的基本防護也差不多就上面這些方法

DDoS攻擊基本上擋不住,不過這種攻擊是有成本的,對方也無法長時間攻擊


水色論壇 http://www.et99.net
簡恩峻分享

頭像
幽雲
 
文章: 109
註冊時間: 2005-06-05 4:12 pm
來自: 夢想幻翼
性別: 男生

Re: 自製WebGame相關技術閒聊

文章幽雲 » 2013-08-21 12:00 pm

我自己是寫actionscript的

其實對我來說在大專案下才會需要用到像mvc架構
不然光是在場景以及State轉換我都覺得好多餘 :face10:

不過有些framework還蠻方便的 , flash有套citrusengine
超快速就可以寫出2D卷軸遊戲 , 不過用Flash要搭jave或其他語言來存取資料
才是讓我覺得棘手(?)的地方



znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-27 10:25 am

有一段時間沒上來了
最進系統開始穩定運作
的確DDos Dos攻擊光是一台Server真的無解
只能等待攻擊結束

這幾天在Server端的程式架構開發已有一個可用的雛型
Server端的架構目前是用MVC的方法下去寫
一開始的確在架構及OO上捉摸了很久
不過先硬著頭皮寫下去,然後才有個東西出來讓我看到好壞
就這樣一路修修改改出來一個基本沒過度OO化的MVC架構

MVC架構我是參考
http://www.jaceju.net/blog/archives/167/
不過我把gateway拿掉,因為現階段用不到,多的架構就是多的負擔
然後也修改了一些範例中的問題
再來就是增加了一些自己的元件跟DB的控制元件等

程式碼的部份有點多,所以只能看自己的心力來分享
目前還在開發中,所以真的沒法子貼出程式碼一個一個解說
程式也慢慢在進化,但大至上就是在OO跟MCV上的應用上花了一些功夫

DB的存取上我是採用自已繼承PDO
代碼: 選擇全部
class GameDB extends PDO {
    //靜態Instance
    private static $s_instance;
    public function __construct() {
        parent::__construct('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ";charset=utf8", DB_USERNAME, DB_PASSWORD);
        $this->exec("set names utf8");
        //• PDO::ERRMODE_SILENT      不顯示錯誤信息,只設置錯誤碼
        //• PDO::ERRMODE_WARNING   顯示警告錯
        //• PDO::ERRMODE_EXCEPTION   拋出異常
        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    public static function getInstance() {
        if (self::$s_instance === NULL) {
            self::$s_instance = new GameDB;
        }
        return self::$s_instance;
    }
    //.................以下是自寫的一些方法
}

因為這個地方變動不大
採用Static的宣告,在每個要用到DB的Model層物件可以不用每隻開都New一次
我的Model底層如下
代碼: 選擇全部
<?php
class GameModel {
   protected $db = null;

   public function __construct(){
      $this->db = GameDB::getInstance();
   }
   
   public function __destruct(){
      
   }
}
?>

這樣只要extends GameModel
就可以直接用$this->db中的方法來存取DB中的資料



znn
 
文章: 36
註冊時間: 2009-02-18 4:06 pm

Re: 自製WebGame相關技術閒聊

文章znn » 2013-08-27 11:00 am

剛那一篇寫到一半發現直接把程式碼片段貼出應該沒多少人搞得懂我在說什麼
我先把我的MVC架構再多說明一下

Model層是模組層
只要跟DB存取有關,還有邏輯有關的都會放在這一層
有一些人還會把模組層再分成還輯層跟資料存取物件層
但我沒有,因為我的遊戲是一個人開發的輕量遊戲
也不是開發Game Framework提供給大家用
所以Model這層我就沒有再分
所有從DB抓來的資料都是用Array()的型態來存取
還有所有邏輯的判定也在此層

View層是顯示層
你只要把要顯示的資料丟給它,它就會echo出結果給Client端
一般我會用到的只有在登入遊戲前所有的畫面是用讀html版型來顯示
登入遊戲後,只讀一次html版型,其他剩下的資料傳送全用JSON
所以我的View有兩種,一個是htmlView,一個是jsonView

Controller層是控制層
我給它的工作如下
1.接收post或get值
2.接收client指令,然後透過Model來操作
3.判斷post或get值的資料「格式」,有沒值,是不是我要的型態(字串長度、數字文字等)
4.在登入遊戲後綁定登入帳號,確認是否登入,如有登入就到Model層的chara物件讀角色資料
5.在此物件釋放之前存角色有變動過的資料
6.catch Exception出來的訊息,透過View回到錯誤
7.回傳資料

基本的MVC架構下,當然還會有一些版型及基礎類別在其它的目錄中
這都跟我上一篇中的範例差不多,只是範例實作了一個簡單案子
一些詳細的實作要親自去寫才會出現疑問
如果看的人有疑問再針對疑問的地方詳細說明做法



下一頁

回到 Webgame製作&改造

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客