2024-08-01|閱讀時間 ‧ 約 7 分鐘

GameMaker|Variable Scope 變數範圍|程式基礎

這篇內容,將會講解什麼是變數範圍,以及與變數範圍相關的知識。有了這些概念,各位會更容易理解,要如何設計程式碼。

本篇教學所使用的系統是Windows 10,如果有按鍵相關的說明,會用Windows的系統來解釋。如果你用的是Mac系統,再麻煩自行換成相對應的按鍵。


前置知識


在學習本篇內容之前,最好具備以下的前置知識,以免看不懂這篇教學的內容。


Variable Scope的簡介


在變數的說明中,我們知道了變數有自己的作用區域,也理解了,不同區域的變數,能有相同的名稱。

因此,在GameMaker當中,變數能依照作用區域的不同,細分成不同作用域的變數。

接下來,我們將解釋,不同作用域的變數,他們各自的特性,以及適合他們的應用場景。


Instance Variable 實體變數


只能在實體範圍內使用的,稱之為實體變數,而這些變數,會在物件(Object)上面使用。你可能會有疑問,為何在物件上使用,卻被稱為實體變數呢?

在講解實體的教學中,我們已經知道,畫面中的所有物體,都是實體。而物件裡的所有設定,都只是用來複製的範本。

因此,在物件裡面的變數,最終都是給實體們做使用,所以才會稱呼為實體變數。


上面我們說到,實體變數的使用範圍,是在物件裡面,這包括了物件裡面的所有事件(Event)。

舉例來說,我們在Create的事件裡,建立了實體變數,那麼在Step的事件裡,就能使用這個變數,來進行邏輯運算,或是重新的賦值。


在不同的物件上面,能有相同名稱的實體變數,但他們會是相互獨立的,並且能各自擁有自己的數值。上述這點,已經有在變數的教學中舉例過,這裡就不再重複舉例。

另外,用同一個物件,所產生的不同實體,他們之間的實體變數,也是相互獨立的。關於這點的解釋,已經有在實體的教學中說明過,如果忘記了,可以回去參考。


Global Variable 全域變數


只要定義之後,整個遊戲專案,都能夠讀取和使用的變數。全域變數能在任何可以寫程式的地方,來進行賦值設定。

全域變數並不會像實體變數那樣,有名稱重複的狀況。只要有任何一個物件(或程式碼),對全域變數進行賦值,那其他地方讀取到的數值,就會跟著一起改變。


這邊舉個簡單的例子:

假設我們想設計一款,多人派對遊戲,所有的玩家,將會共用一條HP(生命值)。只要有玩家受到傷害,HP就會減少,此時我們就能把HP,設定成全域變數。

//將hp設定成全域變數
global.hp = 100 ;

全域變數的設定方法


在設計全域變數的時候,常常會搭配Script Function的功能來使用,我們能利用這個功能,來幫我們的全域變數,進行初始化的設定。

關於Script Function的用途,可以參考這篇教學:

GameMaker|Script Function 腳本函式|程式基礎


Local Variable 局部變數


上面我們所提到的實體變數和全域變數,他們有個特點,就是建立完之後,這個變數就會存放到記憶體裡面,等到要使用時,再從記憶體中取出。

而局部變數的特色,在於執行完特定的事件或函式之後,就會從記憶體中被刪除。也因為這種特色,局部變數通常被用在「用完一次就可以扔掉」的參數上。


局部變數的應用場景,通常都比較複雜,這邊我給不出什麼簡單的範例,因此,我只能告訴各位,要如何設定局部變數。

未來如果在實戰範例中,有使用到局部變數,會再跟各位解釋,為什麼要在那個範例中,使用局部變數。

那麼,以下是局部變數的設定方法:

//將hp設定成局部變數
var hp = 100 ;

局部變數的設定方法


【更新】關於局部變數的用法,可以參考Script Function的教學,裡面有講解到局部變數的應用:

GameMaker|Script Function 腳本函式|程式基礎


Constant 常數


常數是一種特殊的變數,會在遊戲一開始的時候設定一次,接著就永遠不能再改變他。

常數通常會用來存放,一些特殊的數值,以便我們能在遊戲中進行讀取(只能讀取,不能進行賦值的動作)。

在GameMaker當中,我們不能使用自訂的常數,但我們可以用Macro或Enum,來達成常數的效果。


關於常數的說明,我暫時只能提供到這裡,因為我還不熟悉,Macro和Enum的功能,也還不清楚要如何去應用他們。

未來如果我有使用到,也覺得他們很有用,那麼,我會再找個時間,補上相關的應用說明。


Built-in Variable 內建變數


在變數的教學中,我們已經有提到了內建變數,這邊只是要補充說明,內建變數也是有分不同的作用區域。

例如:x、y、speed,是屬於實體變數;fps、game_project_name,是屬於全域變數。




🔔如果內容對你有幫助,可以按個喜歡,這樣就能讓更多人,接觸到這些棒棒的內容🔔


✨祝各位也能開心的做出好遊戲✨

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.