GML 學習手記(GML概況一)

*收到順子大佬的邀請,我有幸能夠將自己的學習筆記投稿到GMS手札專欄上,原文發在牛關上,以後我會兩邊都更新!!

開場白

上了大學後,終於有大把的時間來學習遊戲的製作。也是在Steam上買了GameMaker Studio 2來進行學習和遊戲的製作。但是,這個軟體暫時沒有官中,所以看起來會比較的累,於是就打算用學習手記的方式來記錄自己的學習過程。手記的篇幅與容量會根據自己的學習進度做出一定調整(說白了就是自己傻傻的學得慢=3=)。

學習GML能夠在一開始的學習中,更快的理解各個代碼的含義,所以,我認為認真學一下還是很有必要的。但是,學習的資料實在很少,所以想把自己學習的過程寫成學習手記,方便以後自己查看,同時也方便其他想學GML的小夥伴。

不過本人的英語水平不高,如有翻譯出錯的地方或是我說錯的地方,還請大家一定要指出,大家可以一起討論。


一、Program(程序)

這一節主要就是介紹了代碼在程序中的作用,開發人員可以通過代碼塊來實現2+2=4,也可以實現讓殘血的敵人逃跑。其實,這個有學過編程的小夥伴上手會很快,雖然GML是yoyo為Gamemaker Studio專門定製的一套腳本型的編程語言,不過有編程基礎的小夥伴可以很快就能理解的。

簡單的來說就是這樣:

具體還有這樣:

各項聲明之間必須要有";"(分號)來隔開,以避免聲明變數時發生錯誤,而且讓代碼看起來更加整潔。在之後我們將會開始學習各種各樣的代碼,當然啦,不同的代碼可以實現不一樣的功能。


二、Assignment(賦值)

這一節介紹了GML中的賦值,其實也很好理解。就是將一個值存儲在一個變數當中。簡單的來說是這樣的:<variable> = <expression>; 這樣是最簡單的表達方式。

但是,表達方式也可以更加複雜,例如可以通過「+=」為當前變數添加一個值。就像這個樣子:a += b; 這條代碼表示讓a加上b,並且將結果再賦值給a。同樣的道理,我們也可以使用減法「-=」;乘法「*=」;除法「/=」;甚至可以是更加複雜的位運算,例如「&=」,或者是「|=」和「^=」的形式。關於位運算學過編程的小夥伴應該都知道,但是我沒有。所以,還查了一些資料來理解位運算。

簡單的說一下位運算吧。位運算就是二進位運算。"&="是按位與運算,當兩個數的對應的二進位都是1時,結果才等於與1,否則等於0。"|="是按位或運算,只要兩個數的對應的二進位有一個是1時,結果就等於1,否則等於0。"^="是按位異或運算,當兩個數的對應的二進位互異時,結果才等於1,否則等於0。最後,再以十進位的形式輸出結果。雖然,初學的我還不知道這個演算法的具體作用。

另外,當我們需要遞增或遞減的時候,也可以使用"++"和"--"。


三、Expressions(表達式)

這一節主要是研究了不同的表達方式。表達式可以是實數(例如3.4),也可以是十六進位的數(例如$00FFAA,"$"符號一定要加上),還可以是單引號或雙引號之間的字元串(例如"hello" 或是 hello),或是更多複雜的表達式。對於表達式,存在下列運算符號(按優先順序排序):

1、Assigning(賦值)

這個和第二節的賦值其實差不多,使用"=="來進行比較,用"="來進行賦值。就像下面的這幾個形式:

a = 12; speed = 5; val = (old_val + 5);

2、Combining(結合)

使用運算符&& (與),||(或),^^(異或),再與布爾值相結合,得出true或者false。如下列代碼所示,當得出的結果為true的時候,則運行"{ }"中的代碼。

if (a == b && c == d) {do something...} // 這個是與if (a == b || c ==d) {do something...} //這個是或if (a == b ^^ c == d) {do something...} //這個是異或

3、Comparing(比較)

<, <=, ==, !=, >, >= 這些符號用作比較,只能得出truefalse的結果(也可以把true

理解成1,false理解成0)。 != 是不等於。

if (a < b) {do something...}if (a != b) {do something...}

4、Bitwise(位運算)

&, |, ^, <<, >> 這些符號用作位運算,前面三種演算法在上面的小節當中已經講述過了。<< 這個是左移符號,作用是把一個實數的所有二進位向左移動指定的位數,移動到左邊界之外的多餘二進位位會被丟棄,並從右邊界移入0。例如,14<<2,14(00001110)的二進位位向左移兩位,得出答案56(00111000),所以>>也是同樣的道理。下面是一些例子:

x = (x & $ffffffe0) + 32;if (y ^ $1f) > 0 {do something...};

5、Arithmetical(算數)

+, -, *, / 這些符號就是加減乘除。不用多說啦。

c = a * b;str = a + "world";

6、Increment/Decrement(遞增/遞減)

++, -- 這兩個符號就是遞增和遞減符號。但是值得注意的是,把這些符號放到變數的前面和後面,將會出現不同的結果。

a++ 會把變數a遞增,但是返回遞增之前的值。 ++a 會把變數a遞增,並且返回遞增後的值。

例如,下面的這段代碼:

var a = 1;show_debug_message(string(a++));show_debug_message(string(++a));

其結果是1和3。

接下來解釋一些例子啦:

for (var i = 0; i < 10; i++;) {do something...};if hit == true score--;

註:在GMS平台上編譯時,這些表達式都是從左往右來進行運算的,但是在其他平台上是從右往左進行運算的。

7、Division and Modulo(取整和取余)

div, mod(%) 這是取整和取余的符號。div運算符只會給出除法運算中商數,而去除餘數部分;mod(%)運算符只保留餘數部分,而去出商數的部分。下面又是一些例子:

secs = time mod 60;time_str = string(time div 60);

8、Unary(一元運算)

一元運算是指只接受一個輸入的運算,包括邏輯非、絕對值、三角函數、反三角函數等。(這段話來自wiki,因為我之前也不是很懂什麼叫一元運算。= =)

  • !(not) :否定,把true轉化成false,把false轉化成true
  • - :下一個值變號。
  • ~ :二進位按位否運算,就是把二進位中的0變成1,1變成0。

本節小結

在表達式中的值,我們可以使用數字、變數或者是可以返回一個值得函數,並且子程序可以在括弧中進行書寫。其中比較運算符可以對字元串進行操作,+也可以連接字元串。還有一點很重要的是,當一個表達式中出現多種運算符的時候,使用()是非常非常有必要的,因為不同的編譯器會以不同的順序進行操作。例如下面這條代碼:

a = b == c || d;

這樣的表達不是非常好。因為不同的編譯器會以不同的順序進行操作,所以可能會產生一些奇怪的答案。為了避免這種情況,可以進行下面的修改。

a = (b == c || d); //這樣改比之前好a = ((b == c) || d); //這樣改最好

這一小結最後一個例子,在{ }中書寫一段子程序:

{x = 23;colour = $FFAA00;str = hello world;y += 5;x *= y;x = y << 2;x = 23 * ((2 + 4) / sin(y));str = hello + " world";b = (x < 5) && !(x==2 || x==4);}


專有名詞中英互譯

Code 代碼

Program 程序

Structured 結構化的

Consist 由...組成

Instruction (計算機的)指令

Statement 聲明

Interpret 解釋,詮釋,體現

Structure 結構,體系

Separate 分離,分隔

Variable 變數

Declaration 聲明

Represent 表示,陳述

Subsequent 之後的

Manual 手冊

Complicated 結構複雜的

Bitwise 按位

Priority 優先順序

Quotient 商,商數


推薦閱讀:

使用Unity2017開發MTV:一個Timeline和Cinemacine的實踐
如何製作並發行你夢想的遊戲,避免在過程中狗帶!
神谷英樹和他弟弟的遊戲回憶錄
KBEngine遊戲伺服器(一)——引擎環境配置
美國玩家們是怎麼看待DLC和微交易的

TAG:獨立遊戲 | 遊戲開發 | GameMakerStudio |