程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP網頁游戲學習之Xnova(ogame)源碼解讀(十)

PHP網頁游戲學習之Xnova(ogame)源碼解讀(十)

編輯:關於PHP編程

十三、 建造總覽(buildings.php)

從這篇文章開始,對xnova的研究重點放在流程上面,其實就是大量的函數;至於頁面的構造將不再仔細解釋。

buildings.php文件不只是處理建築金屬礦產等,而是包括了建築、研究、造船廠、防御四個功能;通過傳遞不同的參數來決定進入哪個功能,所以這個文件其實是一個導航文件。下面我們簡單解釋下這個文件。

//更新當前星球的建築隊列,比較復雜
UpdatePlanetBatimentQueueList ( $planetrow, $user );
//處理當前用戶的科技研究
HandleTechnologieBuild ( $planetrow, $user );
//下面是根據參數進入不同的功能頁面
//造船廠頁面
case 'fleet':
FleetBuildingPage ( $planetrow, $user );
//研究頁面
case 'research':
ResearchBuildingPage ( $planetrow, $user, $IsWorking['OnWork'], $IsWorking['WorkOn'] );
//防御頁面
case 'defense':
DefensesBuildingPage ( $planetrow, $user );
//剩下的自然是建築頁面
default:
BatimentBuildingPage ( $planetrow, $user ); 
下面我們看更新當前星球的建築隊列函數
function UpdatePlanetBatimentQueueList ( &$CurrentPlanet, &$CurrentUser ) {
 $RetValue = false;
 //判斷是否有建築隊列,字段b_building_id保存建築隊列
 if ( $CurrentPlanet['b_building_id'] != 0 ) {
 //進入循環,開始處理隊列
 while ( $CurrentPlanet['b_building_id'] != 0 ) {
  //如果當前建造的建築時間小於time的話,就處理,字段b_building保存建築到期的時間
  if ( $CurrentPlanet['b_building'] <= time() ) {
  //先更新下星球的資源,以後再解析
  PlanetResourceUpdate ( $CurrentUser, $CurrentPlanet, $CurrentPlanet['b_building'], false );
  //處理掉當前的建築,並把當前建築字段清空;代碼很多,其實比較簡單
  $IsDone = CheckPlanetBuildingQueue( $CurrentPlanet, $CurrentUser );
  //如果前面處理成功,這裡就要處理隊列中的下一個建築,包括扣除資源
  if ( $IsDone == true ) {
   SetNextQueueElementOnTop ( $CurrentPlanet, $CurrentUser );
  }
  } else {
  $RetValue = true;
  break;
  }
 }
 }
 return $RetValue;
} 

我們繼續下去,跟蹤入CheckPlanetBuildingQueue函數,這個函數代碼挺多,其實簡單;我不寫注釋了,說下流程。先從字段b_building_id解析出來建築的種類、建築或拆除、結束建築的時間等;然後更新該建築的等級,升級或者降級;更新星球的最大空間和使用空間;更新當前建築的時間為0和更新當前的剩余建築隊列。不難吧,呵呵。

接下來處理隊列中的下一個建築,跟蹤SetNextQueueElementOnTop函數,也不難。先從隊列中解析出建築數據;然後判斷是否可以建造,如果可以就要計算建造資源等;如果不行就發送消息等;最後更新建築完成的時間、剩余建築隊列和資源等。和上面的流程一樣簡單,拿下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved