Game Maker 原始程式撰寫 Mark Overmars
Game maker簡介 Game Maker 是一套容易使用的程式,你可以用來創造你自己的電腦遊戲,它並內建了程式語言GML。 它是為降低遊戲設計的難度而寫,不需要寫程式,用簡單直覺的拖放滑鼠介面立即設計自己的遊戲。 你可以輸入或設計影像、子圖形(會動的影像)、聲音並使用他們。你可以很容易地定義遊戲中的物件以及他們的行為表現,你可以設計有捲動背景的華麗場景。萬一你想要對程式全面控管,遊戲製作者中內建了程式語言,讓你可以對遊戲當中的所有元件做控制。
Game maker簡介 遊戲製作者著眼於2-D遊戲的設計,沒有3-D的效果,但是不要失望,許多經典遊戲,如世紀帝國等都是利用2-D動畫特效,使他們看起來像3-D,設計2-D遊戲比3-D要來的簡單、快速。 也許遊戲製作者最棒的部分是免費,你可以沒有限制的創造遊戲,沒有糾纏不休的付費螢幕畫面,喜歡的話甚至你可以賣遊戲,詳細情形請看許可協議文件。
Game maker簡介 Game Maker was written by Mark Overmars. He is a full professor at the Institute of Information and Computing Sciences at Utrecht University in the Netherlands. Here he heads the Center for Advanced Gaming and Simulation, that performs research in areas such as 3D modelling, animation, virtual characters, simulation, human-computer interaction, adaptive game play, and artistic aspects of games. The first public release was version 1.1. It was released on november 15, 1999.
Game maker簡介 Game Maker is written in Delphi (version 7 at the moment). Almost all the code was written by Mark Overmars except for a few freeware components to read different image formats and to compress the data. The Game Maker source code is over 40.000 lines of code. The source code for the runner part is similar in size. The maker part is heavily based on the Windows API. The runner part is based on DirectX (version 8.0 at the moment to keep it compatible with most older computers). Again, this makes it difficult to port it to other platforms.
關於Delphi Borland/Inprise 公司的 Delphi 是一個組合了現代程式語言、整合式開發環境(IDE)和視覺化元件庫(VCL )等功能的強大程式語言。Delphi 的 IDE 很容易為任何使用過相似工具的人所熟悉。例如,你可以在一個所見即所得的表單編輯器中簡單地進行拖放操作,來視覺化地設計一個視窗。更重要的是,由於 Delphi 程式語言的強大和彈性,其架構是物件導向的、可擴展的及可自訂的。 Delphi 的核心是 Delphi Pascal 程式語言。它具有一個現代物件導向語言的所有能力,同時保持了 Pascal 的優雅和簡易。 Delphi 一開始就是作為一個 Windows 程式語言和環境的,而且很多 Delphi 程式設計師認為 Delphi 是所有 Windows 開發工具之中最好的。
安裝 執行gmaker.exe,安裝8.1版主程式。 (2012) 接下來安裝res01.exe、 res02.exe 、 res03.exe 及res04.exe,以增加額外的子圖組、背景及聲音。
場景(Rooms)和物件(Objects) 遊戲製作者設計的遊戲發生在一個或多個場景中(場景是平的,不是3-D立體,但可以包含立體圖樣)。 在這些場景中你可以置放被程式定義的物件,典型的物件有牆壁、移動的球、主角、怪獸等等。有些物件,比如牆壁,固定在那裏,不用做任何事情。 其他的物件,比如主角,會來回移動以及根據玩家由鍵盤、滑鼠或操縱桿輸入的資料來作反應。舉例而言,當主角遇到怪獸可能會死掉。物件是遊戲製作者設計遊戲時最重要的元素。
子圖組(Sprites) 所有的物件需要用可見的圖像呈現在螢幕上,這些圖像稱為子圖組。 子圖組通常不只一個而是由多個圖像組成。這樣他看來像是主角在走路,球在滾動,爆炸的太空船等等。 遊戲過程中經由特別的物件可以變換子圖組(所以當主角走到左邊與走到右邊看起來可以是不一樣的),你可以用遊戲製作者設計子圖組,或由檔案中讀取。
事件(Events) 有一些事情會發生在物件上,稱之為事件。當事件發生時,物件可以有一些動作(Actions)。遊戲進行時大量的事件伴隨發生,以致於你可以讓物件有不同的動作。 舉例來說,當物件被創造(更精確的說,當物件圖例被創造時,一個物件可以有許多不同的圖例組成)時產生了創造事件。舉例來說,一個球物件被創造時可以設定一些運動動作,比如開始運動。當兩個物件相遇時產生了碰撞事件,在這一種情況下你可以讓球停止或轉向,並加入音效。當玩家按了一個按鍵,產生了鍵盤事件,物件可以有適當的動作,像是朝指示的方向移動。每一個物件可由不同的事件帶出動作,用這一種方式來定義物件的行為表現。
下列的東西(通常稱為資源)扮演了決定性的角色 物件:遊戲當中的實體。 場景:物件存在的區域(關卡)。 子圖組:用來表現物件的影像。 聲音:當作背景音樂或是某種影響而被用於遊戲中。 背景:在場景中使用影像當成背景。 進階模式中的資源:paths, scripts, fonts, and time lines。scripts是一段程式碼,能延伸遊戲製作者的可能性。
例子一:反彈球 若干顆球在一密閉房間內各自任意移動,球碰到牆壁或別的球時會反彈,玩家用滑鼠點某到顆球時,可得一分,並且此球跳至隨機位置。 需要兩個不同物件:球及牆壁。另外也需要兩個不同子圖組:一個給球物件,一個給牆壁物件。 接著在滑鼠成功點選到球時發出某種聲音。此遊戲中僅使用一個場景。
反彈球 (1)做牆壁與球的子圖組,從增加(Add)選單中選增加子圖組(Add Sprite) (2)製作物件碰撞的聲音,從增加(Add)選單中選增加聲音(Add Sound) (3)下一步是創造兩個物件,先做牆壁物件。同樣從選擇增加物件(Add Object),會出現一個較複雜的表單。表單左邊是有關於物件的整體資訊,給物件取一個適當的名字(填在Name:)如 “wall”,並從Sprite下拉式選單選擇正確的代表wall的子圖組。由於牆壁是實心,在核取方塊Solid上打勾。(4)再創造一個新物件(Add Object),稱它"ball",給它ball子圖組。
(5)球的事件與動作 事 件 動 作 選 項 創造事件 移動 所有方向 速度(speed)修改為8 碰撞事件(與牆壁物件) 反彈 事 件 動 作 選 項 創造事件 移動 所有方向 速度(speed)修改為8 碰撞事件(與牆壁物件) 反彈 mouse事件(按下左鍵) 播放聲音 加入分數 跳到隨機位置 再開始移動 鍵入數值:1,並勾選”Relative” 。 所有方向,速度8
反彈球 (6)定義場景。從增加選單中增加一個新的room場景到這遊戲中。在視窗右邊你會看到空著的場景。在左邊有三種功能選單,分別是objects(物件), setting(設定)與 backgrounds(背景)。他們的功用如下。 objects(物件) : 左下方用彈出選單來選擇物件。 在場景中,用按滑鼠左鍵的方式把物件圖例放在那裡。你能用滑鼠右鍵移除此圖例。+ <shift> 多物件, +<ctrl> 移動或複製物件 在場景周圍,使用牆壁物件做成邊界。最後,在場景中放置2個球物件。
反彈球 (7)按下執行(Run game)按鍵。如果正確的話,可以看到球開始四處移動。你能按下<Esc>鍵停止遊戲。 setting(設定): 可改變的場景屬性,像是width和height(寬度和高度)。 backgrounds(背景): 也可在左側中央處選擇漂亮的背景圖 SnapX(水平格線的距離),SnapY(垂直格線的距離) ,需配合子圖組的大小。 (7)按下執行(Run game)按鍵。如果正確的話,可以看到球開始四處移動。你能按下<Esc>鍵停止遊戲。
常用事件與動作圖示 事件 按鍵事件 步進事件 離鍵事件 繪圖事件 計時事件 碰撞事件 其他事件 摧毀事件 鍵盤事件 滑鼠事件 創造事件 按鍵事件 步進事件 離鍵事件 繪圖事件 計時事件 碰撞事件 其他事件 摧毀事件 鍵盤事件 滑鼠事件 創造事件 other: 其他事件 Outside Intersect Boundary Game start Game end Room start Room end No more lives No more health Animation end End of path user defined
Move actions Main actions, set 1 踫躍至起始位置 設定垂直速度 設定垂直速度 設定運動方向速度 反轉垂直方向 踫躍至起始位置 設定垂直速度 設定垂直速度 設定運動方向速度 反轉垂直方向 反轉水平方向 移動到接觸點 跳躍至任意位置 跳躍至預定位置 向某點移動 反彈 設定移動方向 Main actions, set 1 到下一場景 摧毀某位置上的物件實例 建立物件實例(含速度與方向設定) 到前一場景 停止播放聲音 播放聲音 到另一場景 改變子圖組 改變物件實例 重玩此場景 建立物件實例 摧毀物件實例
Main actions, set 2 Score 暫停 設定時間軸 載入遊戲設定 儲存遊戲設定 顯示遊戲資訊 顯示訊息 設定計時器 暫停 設定時間軸 載入遊戲設定 儲存遊戲設定 顯示遊戲資訊 顯示訊息 設定計時器 設定時間軸位置 結束遊戲 重新開始 Score 顯示健康值條柱 顯示生命數 假如生命數為某數 假如健康值為某數 設定生命數 顯示高分表 設定健康值 清除高分表 顯示得分 以圖像顯示生命數 假如得分為某數 設定得分
Control Code & Variables Call the inherited event If instance is aligned with grid 離開目前的事件 重覆下一動作 假如使用者回答是 假如骰子的點數為1時 區塊結束 假如某物件實例的數目為某數時 假如在某位置有一物件存在 區塊開始 假如在某位置發生碰撞 假如在某位置無碰撞發生 否則 假如滑鼠鍵被按 假如條件式成立 Code & Variables Comment Draw the value of a variable If a variable has a value Set the value of a variable Execute a piece of code Execute a script
Draw Change fullscreen mode Set a font for drawing text Set the colors Draw a text Draw a line Draw an ellipse Draw a rectangle Draw a background image Draw a sprite image
場景座標幾何示意圖
Scripts 在GM中Scripts等同於procedures和 functions. 以下的scripts等同於procedures: Some_script (arg0, arg1, … , arg9); //And declaring that script: { for (x = argument0; x > argument1; x += argument2) { … }
Scripts 以下是functions,有傳回值: Ans = some_other_script (arg0, arg1, … , arg9); //And in the script itself: { x = argument0 * argument1; … return x; }
The Game Maker Language (GML) 提供將近1000個函式及變數來控制遊戲的進行。 有四個地方可以使用程式:定義Scripts、在事件中設定一個code action、在整個場景創造時、在動作中設定一個數值。 全部的資源(子圖組,物件,聲音,等等)命名時,名稱必須以字母開始並僅包括字母,數字和底線‘_’符號的組合。禁用一些有特別意義的字像是本身(self)、其他(other)、整體(all)、global或所有的資源,以及一些關鍵字。
Variables變數 就像任何一個程式語言,GML 包含變數,變數能貯存實數數值或者是字串,變數不需要宣告,有許多內建的變數。 全域變數,如mouse_x 和mouse_y 能夠指定目前滑鼠位置。 區域變數,針對我們執行這程式時的物件圖例,如x 和y 能夠指定這目前這圖例的位置。一變數有一名稱,這名稱必須以一字母開始並只能包含字母,數字,和底線符號'_'。(最大的長度是64個符號) 。當你使用一個新的變數時,他是針對目前圖例(區域性的),並不被程式中其他的圖例所知道(甚至物件相同時也不知道)
Assignments 指定一個式子的數值到一個變數中,格式如下:<variable>=<expression>; 設計者能使用+=增加它, 使用-=減去它, 使用*=乘它或使用/=除它
Expressions 運算式可以是實數(例如3.4), 在單引號或雙引號之間的字串(例如‘hello’或“ hello ”)或更複雜的運算。以下面的二進位操作模式運作(依照優先順序安排): &&、||:結合布林(Boolean)數值(&&代表”和”,|| 代表”或”)。 <、<=、==、!=、>、>=:比較,結果是真(1)或假(0)。 +、-:加、減。*、/:乘,除。div、mod:整數除、和餘數。
Expressions { x = 23; color = $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); }
Extra variables 在物件名稱後輸入一圓點,並接著這變數名稱,可以在其他物件中設定和讀取該變數。如:ball.speed=0; 創造整體變數,該變數對全部物件圖例是可見的,在變數前輸入”global”以及一圓點。 { if (global.doit) // do something global.doit = false; }
Addressing variables in other instances self:目前執行動作時的圖例。 other:在一碰撞事件中涉及的其他圖例。 all:全部圖例。 noone:根本沒有圖例 global:整體,不是指單一圖例,而是一個儲存整體變數的容器。 other.sprite_index = sprite5; all.speed = 0; global.message = 'A good result'; global.x = ball.x;
陣列 在GML你能使用1維和2維的陣列,每個陣列從索引0起算。 不可使用負的索引。系統的限制可容許每個陣列中最多有32000個索引,總計不超過1000000的大小,寫成下面形式: { a[0] = 1; i = 1; while (i < 10) { a[i] = 2*a[i-1]; i += 1;} b[4,6] = 32; }
If statement if (<expression>) <statement> if (<expression>) <statement> else <statement> 如果x座標小於200,就往右移4點;否則往左移4點 { if (x<200) {x += 4} else {x -= 4}; }
Repeat statement 做出五個球物件在隨機位置 { repeat (5) instance_create(random(400),random(400),ball); }
While statement 在一自由(沒有其他物件)位置上放置目前物件。這個位置如果不是空的,就把它搬走。 { while (!place_free(x,y)) x = random(room_width); y = random(room_height); }
Do statement 把物件搬到空的地方 { do x = random(room_width); y = random(room_height); } until (place_free(x,y))
For statement 初始化一長度為10,數值為1到10的陣列。 { for (i=0; i<=9; i+=1) array[i] = i+1; }
Switch statement 按鍵盤左鍵或數字鍵4,就往左移動;反之亦然。 switch (keyboard_key) { case vk_left: case vk_numpad4: x -= 4; break; case vk_right: case vk_numpad6: x += 4; break; }
break:跳離迴圈 continue:以下一個值繼續 exit:結束整個程式
Functions 函式名稱後面跟隨著零個或數個參數(在括號之間),由逗點分開。 <function>(<arg1>,<arg2>,…) 不可以把函式放在assignment的左邊。 以下的寫法不可以使用instance_nearest(x,y,obj).speed = 0. (錯誤) 必須要這樣寫才可以! (instance_nearest(x,y,obj)).speed = 0. (正確) 靠近某位置的物件速度為0
With constructions 如何將全部的球向下搬移8個像素? 將所有的球移至隨機位置 ball.y = ball.y + 8; (X) ball.y += 8; (X) 這樣的話右邊獲得第一個球的y座標數值並將它加上8。再來這新數值(加上8的數)被設定到全部球的y座標。結果是全部的球都獲得這相同的y座標。 with (ball) y += 8; (O) 將所有的球移至隨機位置 with (ball) { x = random(room_width); y = random(room_height); }
With constructions 摧毀所有球物件 摧毀靠近爆炸點50pixel的所有物件 非常powerful吧! with (ball) instance_destroy(); 摧毀靠近爆炸點50pixel的所有物件 with (all) {if (distance_to_object(other) < 50) instance_destroy(); } 非常powerful吧!
Comment註解 每行程式在” //” 之後的部分將不會被讀取 多行註解: / * 註解 註解 */
Constants常數 true Equal to 1 false Equal to 0. pi Equal to 3.1415.
常用函式 random(x):在0和x之間返回一任意的實數,這數通常比x小。 hspeed:水平速度。 hspeed為正值表示一向右的運動, hspeed為負值表示一向左的運動。 vspeed:垂直速度。 vspeed是正值表示向下運動,vspeed為負值的是向上運動 。 direction:目前的方向(0-360,逆時針方向,0是向右邊)。 speed:目前的速度(像素每步驟)。
常用函式 place_free(x,y):傳回是否這圖例被放置在位置(x,y)時是免於碰撞的。通常用於真正地移動到新位置之前的檢查。 place_empty(x,y) :傳回是否這圖例被放置在位置(x,y)時沒有碰到其他東西,此函式也將非實心的圖例考慮在內。 instance_create(x,y,obj) :在位置(x,y)上創造一obj的圖例,此函式傳回新圖例的ID。 instance_destroy():摧毀目前的圖例。
常用函式 sleep(numb):休眠numb時間(以milliseconds為單位)。 mouse_x*:滑鼠的X-座標,不能被改變。 mouse_y*:滑鼠的Y-座標,不能被改變。 mouse_button:目前壓下的滑鼠按鈕,有下面的值:mb_none,mb_any,mb_left,mb_middle,或mb_right。 keyboard_lastkey最後壓下按鍵的按鍵碼。
常用函式 假設你有一個使用者能以箭號按鍵控制的物件,你可以把下面一段程式碼放在這物件的步驟事件中: { if (keyboard_check(vk_left)) x -= 4; if (keyboard_check(vk_right)) x += 4; if (keyboard_check(vk_up)) y -= 4; if (keyboard_check(vk_down)) y += 4; }
常用函式 sprite_width* :指定這這子圖組的寬度,這數值不能被改變。 sprite_height* :指定這子圖組的高度,這數值不能被改變。 sprite_xoffset*: 指定這子圖組水平的偏移量,依照在子圖組性質中的定義。 sprite_yoffset*指定這子圖組垂直的偏移量 。
常用函式 room_width* :場景的寬度(像素)。 room_height* :場景的高度(像素)。
常用函式 depth:正常的影像,是以圖例創造的先後順序被描畫。預設值是0,可為負數,背景的數值要最大,才能在最底下。 sound_play(index):播放指定的聲音一次。 sound_loop(index):連續播放指定聲音。 sound_stop(index):停止指定的聲音。 sound_stop_all():停止全部的聲音。
補充說明 可製作多人連線遊戲:但僅限註冊版,支援IPX, TCP/IP, Modem, and Serial。
數學加法練習NumberFacts.gm6 for (go=0;go<3;go+=1) { x=round(random(100)); y=round(random(100)); correct = x+y; // get_integer(str,def) // pops up a dialogue box and returns the integer entered answer=get_integer('Add '+string(x) + ' and ' +string(y),''); if (answer==correct) show_message('Well done'); else{ while (answer!=correct) show_message('try again'); }
一些功能的練習 利用alarm跟draw事件實作倒數100。countUp_countDown.gm6 利用執行一小段程式碼實作讓四隻小鬼跟著球跑。followTheLeader.gm6 一次只能推動一顆石頭的小鬼。pushRock.gm6 射擊遊戲實作Paths及改變子圖組。invadersVersion2.gm6
進階範例介紹 彈珠台 小精靈(內建) 1945 (內建) 街頭賽車(內建)很複雜的設計 >-<
參考資料 電腦遊戲製作教學(無日期)。民96年1月10日,取自: http://140.126.110.19/%7Eyuat/GameMaker/Book/contents.htm Mark Overmars(2007).Game Maker Pages.Retrieved January 10, 2007, from the World Wide Web:http://www.gamemaker.nl/ Bill Kerr(2007). Free Game Maker Educational Resources.Retrieved January 10, 2007, from the World Wide Web: http://www.users.on.net/~billkerr/g/int.htm 林東和(民93 )。遊戲製作:使用Game Maker。臺北市:碁峰資訊。