您好,登錄后才能下訂單哦!
FKGameService類是整個游戲邏輯實現的核心它是一個可以復用的業務邏輯類它與游戲實現平臺無關其實現原理與《瘋狂Android講義》書中Android版《瘋狂連連看》游戲中GameService的實現原理相同。
13.6.1 定義FKGameService的接口代碼
根據前面程序對FKGameService對象的依賴程序需要FKGameService對象包含如下方法。
start初始化游戲狀態開始游戲的方法。
hasPieces判斷FKPiece二維數組中是否還剩下FKPiece對象如果所有的FKPiece都被消除了游戲就算勝利。
(FKPiece*) findPieceAtTouchX:(CGFloat) touchX touchY:(CGFloat)touchY根據觸碰點的X、Y坐標來獲取FKPiece。
(FKLinkInfo*) linkWithBeginPiece:(FKPiece*)p1 endPiece: (FKPiece*)p2判斷p1、p2兩個方塊是否可以相連。
為FKGameService類定義的接口部分代碼如下。
程序清單codes/13/Link/Link/sources/board/FKGameService.h
13.6.2 實現FKGameService
FKGameService組件的前兩個方法實現起來都比較簡單。
程序清單codes/13/Link/Link/sources/board/FKGameService.m
面三個方法的實現都很簡單相信讀者很容易理解。下面詳細介紹剩下的兩個方法的實現。
13.6.3 獲取觸碰點的方塊
當用戶觸碰游戲界面時事件監聽器獲取的是該觸碰點在游戲界面上的X、Y坐標但程序需要獲取用戶觸碰的到底是哪個方塊。因此程序必須把界面上的X、Y坐標換算成在FKPiece二維數組中的兩個索引值。
考慮到游戲界面上每個方塊的寬度、高度都是相同的因此想將界面上的X、Y坐標換算成FKPiece二維數組中的索引也比較簡單只要用X、Y坐標值除以圖片的寬、高即可。下面的方法是根據觸碰點X、Y坐標獲取對應方塊的代碼。
程序清單codes/13/Link/Link/sources/board/FKGameService.m
上面的方法中兩行粗體字代碼用于根據觸碰點X、Y坐標來計算它在FKPiece二維數組中的索引值。該方法調用了getIndexWithRelateive:size:進行計算。
getIndexWithRelateive:size:方法的實現就是用relative除以size只是程序需要判斷可以整除和不能整除兩種情況如果可以整除說明還在前一個方塊內如果不能整除則對應于下一個方塊。下面是getIndexWithRelateive:size:方法的代碼。
程序清單codes/13/Link/Link/sources/board/FKGameService.m
13.6.4 判斷兩個方塊是否可以相連
判斷兩個方塊是否可以相連是本程序需要處理的最煩瑣的地方因為兩個方塊可以相連的情形比較多大致可分為如下情況。
兩個方塊位于同一條水平線可以直接相連。
兩個方塊位于同一條豎直線可以直接相連。
兩個方塊以兩條線段相連也就是有1個拐角。
兩個方塊以三條線段相連也就是有2個拐角。
- (FKLinkInfo*)linkWithBeginPiece:(FKPiece*)p1 endPiece:(FKPiece*)p2方法把這4種情況分開進行處理代碼如下。
程序清單codes/13/Link/Link/sources/board/FKGameService.m
程序中的4處粗體字代碼分別代表兩個方塊位于同一條水平線可直接相連、兩個方塊位于同一條豎直線可直接相連、兩個方塊需要兩條線相連、兩個方塊需要3條線相連。上面的方法分別考慮了這4種情況但程序還需要為這4個方法提供實現。
為了實現上面4個方法可以對兩個Piece的位置關系進行歸納。
p1與p2在同一行indexY值相同。
p1與p2在同一列indexX值相同。
p2在p1的右上角p2的indexX >p1的indexXp2的indexY < p1的indexY。
p2在p1的右下角p2的indexX >p1的indexXp2的indexY > p1的indexY。
至于p2在p1的左上角以及p2在p1的左下角這兩種情況程序可以重新執行linkWithBeginPiece: endPiece:方法將p1和p2兩個參數的位置互換即可。
——————本文節選自《瘋狂ios講義上》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。