前言:
在iwanna的開發中,由於越來越需要程序語言的編寫,故在學習GM開發語言相關的同時,記錄於此,包含各種函數,腳本,事件,動作,游戲執行效果,以及一些游戲創建,房間生成算法等
參考文檔:
https://nikaple.gitee.io/iwbt-nikaple-engine-doc/#/ 一個完整的iwana衍生游戲制作框架(必讀)
https://gm8.nihil.cc/ gm8文檔(必讀)
參考視頻:
https://www.bilibili.com/video/BV1yE411b7hw?share_source=copy_web 【GameMaker8教學】
https://www.bilibili.com/video/BV1JA411q7Ar?share_source=copy_web 【GameMaker8教學】第二季
https://www.bilibili.com/video/BV1ck4y1r7Rn?share_source=copy_web 【GameMaker8教學】番外篇過渡到GameMaker: Studio 2
基礎函數:
// 注釋單位
show_message(str) //顯示一個對話框以輸出信息。參數為一個字符串。彈出窗口時游戲會自動暫停。
message_text_font(name, size, color, style) //設置彈出框里文字的字體。
// name 是指 windows 通常字體名字,如 “Arial”,”Gigi”,”Meiryo”,記住要用雙引號。可以在控制面板->外觀和個性化->字體查看有哪些字體名字。
// size 是指字體大小。
// color 是指形如 c_red,c_green,c_blue 的系統自帶常量,具體可以使用哪些顏色,請參閱 GML 漢化文檔的第 46 頁。如果你懂得混色的原理(見第十章),你也可以用 make_color_rgb(red, green, blue) 來自定義顏色,用他的返回值作為 color 參數。
// style 是指字體樣式,0 表示默認,1 表示粗體,2 表示斜體,3 表示粗斜體。
// 該函數是永久有效地設置字體,一旦執行,之后游戲的所有彈窗都會使用這個字體。
// 注意,要寫在 show_message 前面!
string(val) // 返回實數 val 轉換的字符串(轉換字符換)。注:字符串可以用 + 號加在一起
get_integer(str, def) // 彈出窗口獲取一個實數。str 是顯示的信息,def 是默認參數。類似於python的input
get_string(str, def) // 彈出窗口獲取一個字符串。str 是顯示的信息,def 是默認參數。效果與 get_integer 類似。
message_input_font(name, size, color, style) //設置彈出框中輸入框文字的字體。參數同 message_text_font。
show_question(str) // 彈出一個窗口,顯示一個字符串,並且提供兩個按鈕:yes,no,玩家按下 yes 返回 1,按下 no 返回 0。
對象(Objects)
對象自身會帶有一些變量,這些變量通常與對象自身的狀態、屬性、行為相關。例:
- x 對象的實例在房間的位置的x坐標。
- y 對象的實例在房間的位置的y坐標。
- speed 對象的實例的速度(單位:像素/步)。
- gravity 對象的重力(單位:像素/步²)。准確的說應該是對象的加速度。
- sprite_index 對象的實例的圖像(精靈,Sprite)對應的索引(Index)。
GM 自帶的變量會自動染上紅色,切記自定義的變量名不能和自帶變量的變量名沖突!
對象實例的創建
instance_create(x, y, obj) // 在房間的 (x, y) 的位置創造一個對象 obj 的實例,並返回這個實例的索引(ID)
alarm[0] = 50; // 這句話的意思是 50 步(幀)之后執行 alarm 0 事件(計時器0號事件)
speed = 6; // 注意:speed默認方向為向右,6像素/步
instance_destroy(); // 寫入 對象離開游戲房間事件 ,實例對象在超出房間邊緣時會自我銷毀:
對象實例的交流
兩個對象要如何實現數據的交流,方法之一就是使用成員運算符 .
就是一個小數點(和python使用方法類似)
對於單個實例的數據交流
inst = instance_create(100, 200, objBulletdu); // 創建objBulletdu對象
inst.speed = random_range(2, 8); // 令objBulletdu對象向右邊隨機移動的 2~8 的速度
alarm[0] = 50; // 50 步(幀)之后執行 alarm 0 事件(計時器0號事件)
// 利用 instance_create 函數會返回被創建的實例的索引的特性
(instance_create(100, 200, objBullet)).speed = random_range(2, 8); // 函數 instance_create 一定要用括號括起來
// 在已知索引的情況下,我們也可以直接使用索引來訪問/修改這個實例的變量。
(100012).speed = 12; // 注意索引一定要用括號括起來👇
with語句
如果我們不只是想讓對象/實例之間進行數據的交流,而是想讓某個對象/實例命令另一個對象/實例執行一個函數或者一段代碼呢?
with (obj/ID)
{
xxxx;
xxxxx;
}
GM自帶的圖像相關變量
image_speed = 0; // 值為0時表示實例的精靈不播放
// 值為 1 時表示播放速度為 1 張/幀
image_index = 1; // 一個精靈的圖像都有各自的編號:精靈的第一張圖像是 0 號,第二張圖像是 1 號,第 n 張圖像編號是 n-1,通常和 image_speed = 0; 一起使用,使精靈停留在某一張子圖像上,很少單獨使用。
image_single = k;
// 等效於:
// image_speed = 0;
// image_index = k;