跳轉到

理解 Grid++ 核心模型

打地鼠已經使用了 GridEngine、GridObject 與 Overlay。現在我們回頭觀察它們如何合作,建立一套能繼續擴充遊戲的模型。

Grid++ 把遊戲世界切成固定大小的格子,角色的位置使用「第幾欄、第幾列」表示;螢幕像素位置再由格子座標換算。西洋棋、貪食蛇、踩地雷與 Pacman 都可以用這種模型描述:物件一次位於一格,移動通常代表從目前格走到相鄰格。

                       x
         0        1        2        3
     +--------+--------+--------+--------+
   0 |        |        |        |        |
     +--------+--------+--------+--------+
y  1 |        | Player | Pellet |        |
     +--------+--------+--------+--------+
   2 |        |        | Enemy  |        |
     +--------+--------+--------+--------+

在這張地圖中,玩家位於 (1, 1),豆子位於 (2, 1)。玩家向右移動一格後,兩者會出現在相同座標,遊戲便可以把它解釋成一次碰撞。程式不需要自行比較兩張圖片的像素或計算矩形是否重疊。

Grid++ 處理每個網格遊戲都會重複遇到的工作:建立視窗、持續更新畫面、保存遊戲物件、把網格座標換算成像素、檢查同格碰撞,以及在結束時釋放資源。使用者負責描述遊戲內容和規則,例如地圖大小、玩家如何移動、碰到豆子要增加多少分,以及何時結束遊戲。

一個遊戲的三個部分

Grid++ 使用三種角色組成遊戲程式:GridEngineGridObjectOverlay。三者分別承擔遊戲流程、遊戲實體與畫面資訊的責任。

GridEngine
|-- GridObject
|   |-- Player
|   |-- Enemy
|   |-- Item
|   `-- Maze
`-- Overlay
    |-- Score
    |-- Timer
    `-- Button

GridEngine 是遊戲的管理者。它知道網格有幾欄、幾列,每格要畫成多少像素,也保存目前加入遊戲的物件。程式呼叫 Run() 後,Engine 會持續推進遊戲,直到視窗被關閉。這個持續執行的過程稱為遊戲主迴圈。

GridObject 是存在於遊戲世界中的一個實體。玩家、敵人、豆子或寶箱雖然行為不同,但都需要座標、畫面和碰撞,因此共用同一組基本能力。每一個實際建立出來的玩家或敵人稱為一個 instance;兩個同類物件可以有不同的位置和狀態。

Overlay 是不屬於遊戲地圖的畫面內容。分數位於視窗左上角,不代表分數「站在地圖的第零格」;重新開始按鈕也不應該和玩家發生碰撞。因此 Overlay 使用像素座標,並在遊戲世界繪製完成後顯示。

三者的區分讓程式規則保持明確:Engine 管理流程,GridObject 參與遊戲世界,Overlay 顯示額外資訊。

遊戲如何持續運作

電腦遊戲不是只執行一次的程式。視窗開啟期間,Engine 會反覆執行一個 frame;每個 frame 代表畫面的一次更新。Grid++ 預設目標是每秒 60 個 frame。

讀取物件行為
更新遊戲狀態
檢查同格碰撞
重新繪製畫面
進入下一個 frame

「狀態」是會隨遊戲過程改變的資料,例如玩家位置、目前分數、敵人方向或下一次移動時間。「更新」表示根據輸入和規則修改狀態;「繪製」或 render 表示把目前狀態轉成視窗中的畫面。分開這兩件事後,同一份狀態可以持續變化,而畫面每幀反映最新結果。

GridObject 可以在更新階段移動或改變素材。兩個可見物件更新後位於同一個有效格子時,Engine 會通知它們發生碰撞。繪製階段再依 z-index 決定物件上下順序,最後把 Overlay 畫在所有網格物件上方。

使用 Grid++ 時不需要自行撰寫這個迴圈。程式只提供需要在特定階段執行的行為,Engine 負責在正確時間呼叫。

素材與選用功能

遊戲物件的行為和外觀是兩件事。GridObject 使用素材名稱描述外觀,Engine 從素材包取得對應圖片;同一份程式可以替換素材包而不改變移動與碰撞規則。沒有素材時,Grid++ 會畫出紅色 fallback 方塊,讓功能仍可測試。

不需要圖片時,GridShapes.h 提供方形、圓形、三角形、五邊形與五芒星。這些圖形仍然是 GridObject,只是自行使用 raylib 繪製,不從素材包取得圖片。

GridMaze 是另一個選用功能。它保存哪些格子是牆,並能根據相鄰牆面選擇合適素材。迷宮本身負責牆面資料與繪製;玩家在移動前查詢下一格是否為牆。

深入了解 GridEngine