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(比較)
<, <=, ==, !=, >, >= 這些符號用作比較,只能得出true和false的結果(也可以把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 |