linwebs

林林.台灣 | Linwebs - 課程

跨平台圖形化程式開發 - (3)賽車遊戲開發-程式碼實作

本文章為嘉大資工讀書會第二期課程內容
場次 4-1 【跨平台圖形化程式設計開發(二)】 跨平台圖形化程式開發

本文章接續前一篇文章【跨平台圖形化程式開發 - (2)賽車遊戲開發-介面編排設計】內容

本文章為步驟截圖,詳細說明請參照課程影片。

此程式以 game_status 變數作為遊戲狀態的 flag,狀態如下:
0 => init 遊戲被開啟時
1 => playing 遊戲遊玩時
2 => pause 遊戲暫停時
3 => timeout 時間到,遊戲結束時
4 => die 碰到障礙物,遊戲結束時

PS: 本課程圖片較多,此頁面圖片有經過壓縮處理,若圖片模糊不清,可點選圖片開啟圖片原始檔

  1. 首先,先讓背景可動態移動,隨著車子的前進而改變。
    開啟【mainwindow.h】的標頭檔撰寫以下程式碼。
  2. 在此使用計時器,每當一段時間就呼叫函式,執行移動背景的程式碼片段。
    首先,引入 QTimer 檔案。
    接下來,在建構子函式中加入以下程式碼,並撰寫 update_object 的函式。
  3. 建置並執行,可看到背景已可動態的移動,彷彿車子不斷在前進。
  4. 接下來,加入遊戲時間計時的部分,在標頭檔中加入以下程式碼。
  5. 撰寫以下遊戲時間計時器及遊戲停止的程式碼。
  6. 建置並執行,可看到遊戲時間計時器已可運作。
  7. 切換到 ui 設計的部分,點選開始遊戲的按鈕,加入按鈕的觸發事件。
    在按鈕上點選滑鼠右鍵,選擇【跳到信號槽...】。
  8. 選擇【QAbstractButton】中的【clicked()】訊號。
  9. 可看到 Qt Creator 自動產生觸發此按鈕時,會執行的函式的程式碼。
  10. 到原始碼中撰寫遊戲開始會執行的動作。
  11. 建置並執行,可看到當點選開始按鈕時,遊戲標題及開始按鈕會隱藏,計時器會開始計時。
  12. 當按下鍵盤方向鍵時,移動車輛的位置,到標頭檔中撰寫以下程式碼,偵測鍵盤按壓的事件。
  13. 到原始碼中引入 QKeyEvent 和 QDebug 檔案。
    QDebug 類似 C++ 的 cout 功能,可在 Qt 程式測試時輸出 Debug 訊息在 Qt Creator 上,方便程式的偵錯。
  14. 由於開始遊戲的按鈕會優先搶奪 ui 的 focus,必須至 ui 設計中,把按鈕的 focusPolicy 設為 NoFocus,才不會導致按下按鈕時,讓程式誤以為要對按鈕進行操作。
  15. 建置並執行,按下鍵盤上下方向鍵,可在 Qt Creator 中看到輸出的訊息。
  16. 接下來撰寫移動車子的程式,切換到原始碼,撰寫以下程式。
  17. 撰寫以下程式。
  18. 建置並執行,按下鍵盤上下方向鍵,可看到車子可上下移動。
  19. 當車子碰到跑到邊緣時,遊戲會停止。
  20. 接下來,讓遊戲增加難度,新增一些障礙物在遊戲中。
    在 ui 設計中加入一些 Label。
    block_01 = {
      objectName: block_01,
      geometry: [x: 620, y: 40, 寬度: 64, 高度: 64],
      pixmap: item1.png
    }

    block_02 = {
      objectName: block_02,
      geometry: [x: 620, y: 110, 寬度: 64, 高度: 64],
      pixmap: item2.png
    }

    block_03 = {
    objectName: block_03,
    geometry: [x: 620, y: 180, 寬度: 64, 高度: 64],
    pixmap: item3.png
    }
  21. 接下來讓障礙物會隨著車子的前進而移動,在標頭檔中增加以下程式碼。
  22. 首先,在程式被開啟時,將障礙物放在畫面看不到的地方。
  23. 使用 define 定義障礙物的位置(也可使用陣列、結構等方式儲存)。
  24. 撰寫以下程式碼,當背景移動時,也移動障礙物的位置。
  25. 建置並執行,可看到障礙物已可移動,但發現會有障礙物可壓在車子上方的情況。
  26. 原因是因為圖層的問題,障礙物位於比車子高的圖層。
    到 ui 設計的地方,在障礙物上按滑鼠右鍵,點選【送回背景】,將所有障礙物移至圖層的最下層。
    最後,將 background 的背景,點選【送回背景】,將背景回歸至最下層的狀態。
  27. 建置並執行,可看到車子已不會被障礙物所覆蓋。
  28. 接下來,偵測車子是否碰撞到障礙物,當碰撞到障礙物時,則遊戲結束。
  29. 切換至原始檔,針對每個障礙物撰寫偵測障礙物的程式碼。
  30. 撰寫以下程式碼。並讓障礙物每次移動時,偵測是否被車子碰撞。
  31. 建置並執行,可看到車子碰撞到障礙物時,遊戲結束。
  32. 當遊戲結束時顯示【遊戲結束】,並顯示【開始遊戲】的按紐。
  33. 建置並執行,可看到當遊戲結束後,會顯示此畫面。
  34. 當遊戲再次開始時,啟動物體移動計時器,但由於當成是一開啟時,物體移動計時器就已經被開啟,再次開啟會導致發生錯誤,因此用以下程式碼判斷,當物體移動計時器未被開啟,則將它開啟。
  35. 接下來,加入選單的部分,切換到 ui 設計,點選上方的選單。
  36. 在此處輸入選單的選項,在此請先以英文做輸入,此輸入的值會作為函式的名稱(下一步驟再將其修改為中文)。
    (在此示範加入兩個選單,且中間加入一個分隔器)
  37. 點選下方的選單,調整選單的設定。
  38. 選單的設定值如下圖所示。
  39. 建置並執行,可看到選單已顯示在畫面上。
  40. 接下來撰寫選單被點觸發時所要執行的事件,在選單上點選滑鼠右鍵,點選【跳到信號槽...】。
  41. 選擇【QAction】中的【triggered()】訊號。
  42. 撰寫當選單被點選時,所要執行的程式碼。
  43. 遊戲暫停的函式有兩個狀態,在變更遊戲狀態時,要調整選單的文字。
  44. 在遊戲停止時也是要變更選單的文字。
  45. 遊戲開始時也是如此。
  46. 建置並執行,點選選單中的選項,測試選單的運作。
  47. 接下來,加入按下鍵盤空白鍵可讓遊戲暫停的程式碼。
  48. 最後,修改視窗的標題文字。
  49. 到 ui 設計中選擇【MainWindow】,調整【windowTitle】可變更程式視窗的標題文字,調整【windowIcon】可調整程式視窗的 icon。
  50. 選擇視窗的 icon。
  51. 建置並執行,可看到遊戲已可遊玩。
  52. 恭喜您已遊戲的設計,接下來請閱讀下一篇文章【跨平台圖形化程式開發 - (4)賽車遊戲開發-發布 Windows 程式】將程式發布。
建立時間:2021/5/26 PM 2:11
修改時間:2021/5/28 AM 10:52
作者: Linwebs

bookmark標籤