跳轉到內容

遊戲製作程式設計/難題

來自 Wikibooks,開放世界中的開放書籍

此模組的目的是讓更多經驗豐富的遊戲製作學生能夠寫下他們如何解決特定問題,以便那些可能正在努力解決相同(或類似)問題的人從中受益。

難題並不一定是指高階主題。它們可以是任何讓你花費很長時間才能弄清楚的東西,無論該功能或操作是基本還是高階。

請貢獻

如果遊戲製作或 GML 中的某些東西讓你困惑了一段時間,為什麼不在這裡寫出來呢?

How do you make objects fall(in a platform game)in a way so that they rotate when they collide onto another object?

結構

與所有華夏公益教科書一樣,此模組的結構無疑會隨著時間的推移而發展。經驗表明,人們在被給予一個樣本結構來遵循時,通常會做得更好,並且有自由發明他們想要的任何結構。隨著時間的推移,使用者會將任何頁面的結構修改為最適合他們的結構。為了幫助,這裡有一個樣本結構,供難題遵循

我試圖做什麼
什麼不起作用

什麼有效

如前所述,您可以自由使用任何適合您的結構。

概念

這不是旨在重寫遊戲製作手冊。但有一些難題是新手(和經驗豐富的)程式設計師會遇到的。這裡應該描述一些令人困惑或難以理解的概念。

行話

物件和例項

使用遊戲製作建立的程式(遊戲)是按照“面向物件程式設計”的原理設計的。

面向物件設計的三個支柱是多型性、封裝和繼承,這些是另一個維基頁面的主題。但是,所有這些想法都是透過將複雜程式的設計組織成“物件”的想法而實現的。從一個物件中,該物件的例項被建立並根據該物件定義的方法和屬性使用。

簡單地說,物件基本上是建立例項的模板。例如,你在玩遊戲時在螢幕上看到的東西是這些物件的“例項”。

可以將物件視為建立例項的模板或食譜。在一般的面向物件程式設計中,物件具有方法和屬性。方法是物件可以執行的動作。如果我們的物件是一輛汽車,它將具有以下方法

  * Start
  * Speed up
  * Slow Down
  * Turn left
  * Turn Right
  * Back up

每個方法都將附帶一個方法定義,詳細說明物件執行該動作所需的步驟。

物件的屬性只是物件的描述。例如

  * Color
  * Size
  * Year
  * Make
  * Model

汽車的物件定義

因此,當我們定義“汽車”物件時,我們會說,“讓一個型別為‘汽車’的物件存在。每輛汽車都有自己的顏色、尺寸、年份、製造商和型號。此外,每輛汽車都可以啟動、加速、減速、左轉、右轉和倒車”。

建立“汽車”物件的例項

這裡我們開始在我們的世界中使用該物件。要建立一個汽車的例項,我們會說,“給我一輛汽車。這輛汽車將是紅色的,這輛汽車的尺寸很小,是 1982 年的。將這輛汽車的製造商命名為‘mycarcompany’,將這輛汽車的型號命名為‘SuperSpeedy’”。

我們會得到一輛具有給定描述的汽車,並且現在已經生成了一個“汽車”物件的例項。由於所有汽車都是從汽車物件建立的,因此這輛汽車還將具有預定義的啟動、加速、減速、右轉、左轉和倒車的功能,這些功能在“汽車”物件(模板)中定義。

現在我們可以說,“給我一輛汽車。這輛汽車將是藍色的,這輛汽車的尺寸很大,是 2010 年的。將這輛汽車的製造商命名為‘SuperCompany’,將這輛汽車的型號命名為‘FasterCarNumberOne’”。

此時,我們將擁有兩個“汽車”物件的例項。術語“例項”源於我們正在例項化“汽車”物件。

另一種說法是從製作汽車的食譜(物件)中,我們建立(例項化)了兩輛汽車;現在我們擁有兩個“汽車”物件的例項。

高階:每個例項在建立時都會被賦予自己的例項 ID。使用例項的唯一 ID 使設計者能夠直接引用物件的特定例項,例如,當建立了許多例項並且希望引用其中的一個而不是所有從物件建立的例項時。

動作或事件?

在遊戲製作程式中,事件顯示在物件屬性框的中心。動作被拖放到物件的事件中。

事件實際上是傳遞給遊戲中的物件例項的訊息。每當事件發生時,你放置在事件中的動作就會被執行。這會產生物件例項的行為。

常見問題

遊戲製作程式問題

本節將討論人們在學習使用遊戲製作時遇到的某些問題。錯誤訊息也可能在本節中討論。

我的電腦宕機、卡住或凍結

  1. 你在任何地方使用while語句了嗎?
    While語句是導致系統掛起的一個常見原因。如果 while 迴圈沒有結束(無限迴圈),則計算機將凍結。

我點選物件屬性中的圖示,但沒有任何反應

  1. 物件屬性選單右側的圖示旨在拖放到事件中。
  2. 右鍵點選圖示也會將其新增到事件中。

物件問題

物件卡住

很多時候,移動物件會卡在牆壁或其他靜止物件上。

  1. 對於移動專案,將“solid”標誌設定為false
  2. 對於靜止專案,將“solid”標誌設定為true
  3. (平臺遊戲專用)對於與牆壁發生碰撞事件的移動物件,檢查移動物件的正下方是否有物件(牆壁),如果有,將 vspeed 設定為零。
  4. (平臺遊戲專用)現在檢查移動物件的正左側是否有物件(牆壁),如果有,將 hspeed 設定為零,如果移動物件的右側有物件(牆壁),執行相同的操作。

物件掉出地板

移動專案不應設定為 solid。問題是非 solid 物件往往會掉出地板,或者有時會穿過牆壁,而你並不希望它們這樣做。

  1. 建立一個非透明精靈,其大小與物件相同或略小。
  2. 在物件屬性框中,轉到“蒙版”並選擇該精靈。

物件出現在房間的左上角

  1. 確保物件的“相對”標誌設定為true

變數問題

字串和數字

每當我想要顯示訊息、連線字串或新增變數時,都會收到“引數型別與 + 不匹配”的訊息。

  1. 確保你在“設定變數”對話方塊中沒有將字串新增到數字,反之亦然。

步進事件問題

步進事件中的任何內容都將在每一步發生。所以要小心你放在裡面的東西。

請勿將以下內容放在步進事件中(或者如果你這樣做,請非常小心...)

  • 時間線
  • 繪製精靈
  • 聲音
  • 建立例項

為了避免在步進事件中使用以下操作而可能發生的錯誤,您可能需要新增一個隨機動作。如果您在使用以下動作進行測試時沒有采取預防措施,可能會導致遊戲延遲。如果延遲嚴重,可能會導致您的電腦崩潰。

繪圖問題

物體不可見

可能發生的情況:當您建立一個新物體時,Game Maker 會繪製您選擇的用來代表該物體的精靈。但是,無論何時您在物體中新增繪製事件,您在繪製事件中新增的任何動作都會覆蓋該物體的正常繪製。

  1. 確保“可見”標誌設定為 *true*。
  2. “繪製精靈”動作必須位於“繪製事件”中。
    或者
  3. “繪製事件”中的指令碼必須包含以下函式:
    draw_sprite(sprite_index,image_single,x,y)

文字不可見

  1. 繪製文字的第一條規則
    您只能在兩個地方放置繪製動作。
    * 繪製事件(繪製動作在其他地方會被 *忽略*)
    * 指令碼(但不能是“執行一段程式碼”動作,它也必須位於繪製事件中)
  1. 繪製文字的第二條規則
    僅當例項被標記為可見時才會繪製

滑鼠和鍵盤問題

  1. 左鍵、左鍵按下和左鍵釋放之間的區別是什麼?
    **左鍵** - 動作 *持續進行*,只要按鈕被按下。
    **左鍵按下** - 僅發生 *一次*。
    **左鍵釋放** - 當按鈕被釋放時僅發生一次。
  2. 當我點選滑鼠結束遊戲時,它經常(或總是)會啟用我 Windows 桌面上的一些東西。
    將您的 *結束遊戲* 操作設定為由滑鼠按鈕 *釋放* 啟用。這樣一來,當您的遊戲關閉時,您的點選不會傳遞到桌面。
  3. 我想使用我的滑鼠在右鍵點選螢幕上的任何地方時執行一些操作,但沒有反應!
    確保您將滑鼠點選事件設定為 *全域性滑鼠*。

如果一個網站從 *問題解決* 的角度(而不是教程等)來處理 Game Maker 問題,請新增連結。

華夏公益教科書