GMS2官方教程系列8/8——隨機生成敵人

大家好,這是官方教程的最後一部分內容,Heartbeast大大的視頻翻譯工作還在進行中,圖文則尚未開始,一定會繼續的:)

————————————————————————————————————————

【中文教程】GameMaker Studio 2官方教程8/8--隨機生成敵人 http://www.bilibili.com/video/av11040505/

今天要學習的是如何隨機生成敵人,在之前的學習過程中我們都是直接在場景編輯器中添加了幾個敵人用來測試遊戲的,但是那樣有一些問題,比如你放幾個敵人就是幾個,打完了就沒了,那遊戲也就無法繼續了,不同的玩家之間也缺乏了一個比較的依據,因此我們希望遊戲能隨著時間不斷自動生成敵人,並且敵人的位置是完全隨機的,那麼我就開始今天的課程。首先我們在場景編輯器中給敵人單獨創建一個實例圖層並取名為「EnemyLayer」,然後要記得我們需要調整一下順序確保飛船所處的圖層一直在最上方:

在敵人的圖層創建好以後,我們要再創建一個對象,這個對象是用來作為敵人生成器的:

這個對象我們同樣採用敵人的精靈作為貼圖,但是稍微不同的是,我們需要在創建的時候把這個圖設置的很小,如圖所示,我們創建了一個Create事件,並在這個事件中寫了兩行代碼:

image_xscale = 0.1 ;image_yscale = 0.1 ;

這兩個屬性也是GMS2自帶的屬性,分別是圖像高寬的縮放比例,我們在這裡把高寬的縮放都設置為0.1即代表高寬都只有原圖的1/10大小,這樣就代表這個對象在生成實例時會顯示的很小,整體面積只有原圖的1/100。我們這個生成器就是希望讓敵人有一種慢慢變大最後完全生成的感覺,因此我們還需要寫一個方法來使得圖像逐漸變大,這裡我們應該還能記得在上一課曾經用過一個方法去使得圖像的透明度逐漸增加,我們這裡用類似的方法即可達到目的,首先我們需要創建一個step事件:

其中我們寫了這些內容:

image_xscale = min(image_xscale+0.02,1)image_yscale = image_xscale ;if (image_xscale = 1) instance_change(obj_enemy,true);

第一行就跟我們上節課中逐漸增加圖片透明圖的方法幾乎一樣,只是這次我們修改的不是圖片的透明度,而是圖片的寬度的縮放比,同樣用min這個方法來反覆獲得最小值,直至前面image_xscale的值大於1以後就永遠被賦值為1即原圖大小,第二行我們沒有重複這個步驟是因為我們希望圖像的高度縮放比跟寬度縮放比完全同步,因此直接將二者相等關聯起來即可。但是這個逐漸變大的圖像是敵人生成器,而敵人生成器中沒有任何行為邏輯代碼,是不能像敵人一樣來追趕玩家控制的飛船的,也不可能對玩家射出的子彈和玩家的飛船進行交互和碰撞,那麼我們希望的就是這個生成器能變成一個敵人的實例,這裡就用到了GMS2的另一個自帶的方法instance_change,如上圖最後一行。在最後我們寫的那一行意思是,當圖像的縮放比與原圖完全一致以後,將當前的實例替換為敵人對象的實例,由於我們生成器所使用的圖像與敵人的圖像完全一致,因此當生成器的圖像尺寸達到原圖尺寸以後,這個即時的替換是玩家無法察覺的,玩家只會看到一個敵人由小變大然後到達正常尺寸以後就會完全按照敵人的行為邏輯來追趕他控制的飛船,並不會知道前面逐漸變大的那個圖像跟後面來追逐他的敵人其實是兩個完全不同的實例。為了測試這個生成器能不能正常工作,我們要去場景編輯器中,將幾個生成器的實例放進場景進行測試,這裡一定要注意,我們要放進場景的是今天創建的生成器的實例,而非敵人對象本身。當運行遊戲測試通過以後,我們要注意,現在雖然敵人有了一個生成的過程,但是這些敵人依然是我們在場景編輯器中提前放進去的,這些敵人的位置永遠在那幾個地方,數量也是恆定不變的,這還沒有達到我們最初的要求——讓敵人隨著時間的推移不斷增加。於是我們又需要再創建一個新的對象,這個對象是不可見的,其作用就是在玩家看不到的地方默默地在場景中製造敵人(生成器)。這個對象的名稱可以根據自己的喜好進行定義,當然最好跟之前的命名規則保持一致,然後我們需要一個Create事件來初始化一些屬性:

如圖,我們初始化了一個自定義的變數,還用到了GMS2自帶的倒計時方法alarm:

spawnrate = 60 ;alarm[0] = spawnrate ;

這裡我們首先自定義了一個spawnrate的變數,這是我們希望用來控制敵人生成時間間隔的一個屬性,然後我們把這個變數的值定義給了一個alarm[0],這是GMS2自帶的倒計時方法,在添加事件的列表中我們可以看到有專門一個alarm的事件列表:

這意味著,當我們定義的某個倒計時數字等於0時,就會觸發對應事件中的代碼,而我們之前定義了alarm[0],因此我們直接再添加一個對應的alarm[0]的事件:

我們在這個事件中定義了在遊戲場景中隨機的位置生成一個新的敵人生成器的實例:

instance_create_layer(random(room_width),random(room_height),"EnemyLayer",obj_enemyspawn)alarm[0] = spawnrate ;

這上面一句翻譯一下就是:

在後面參數所指定圖層中指定的位置創建一個指定的實例(隨機取一個小於等於後面參數並大於0的值(場景的寬度),隨機取一個小於等於後面參數並大於0的值(場景的高度),敵人圖層,敵人生成器對象)alarm[0]的值重新定義為spawnrate的值

第一句就是在場景內隨機獲取一個x、y坐標,然後在敵人圖層的這個位置生成一個敵人生成器對象,而經過我們之前的實驗我們知道,生成器對象將會在遊戲中自動變成真正的敵人對象。然後最後我們要記得給alarm[0]重新賦值,因為這一串代碼是當alarm[0]倒計時等於0以後觸發的,如果我們不重新設定一個值,那這個倒計時永遠等於0,那就不會再次被觸發,因此需要重新賦值,確保這個倒計時能反覆被觸發,那敵人也就會源源不斷的生成了。當完成以上內容以後,可以再次打開遊戲進行測試,這時候你就可以挑戰一下自己到底能得到多少分了,也可以藉此跟朋友們一較高下:)

在完成這系列翻譯的那個周末B站有人給我充了一次電,感激且有一些惶恐,我希望這些東西能幫到更多人,能有那麼一些價值,希望大家能更多跟我互動(比如更喜歡什麼方向的內容,或是有什麼建議之類),給我更多動力,感激不盡~

推薦閱讀:

TAG:GameMakerStudio | 遊戲開發 |