還在忍受那些遊戲么?不如來做你自己的遊戲!(一)平台跳躍

事先聲明:本人除了熱愛遊戲外,沒有任何利益相關。如果文中出現了版權等問題,請及時提醒,多謝!當

其實去年還在有工作的時候就準備鑽研這個引擎,只是一直在被各種遊戲嘿嘿嘿。過年前在家的這段時間也沒有鑽研,而是自學了lua(三腳貓)以及精通了一下axure,yed等平時常用的1工具想開年找工作順利些。

然而沒想到的是,過完年到現在一個多月了,一直找不到工作,所以時間放著也是浪費了,乾脆就好好學學這個引擎(其實本來想先學U3D的),為自己以後自己做獨立遊戲打個基礎。

接下來的專欄主要是通過翻譯youtube著名的gamemaker教程作者Shaun Spalding的教程,加上一些自己的想法以及對教程的理解,和大家一起研究學習這款引擎。

如果有理解錯或者搞錯的地方,希望大家及時指正,一起進步,謝謝!

---------------------------------------------------------------------------------------------------------------------------

言歸正傳,先來介紹一下GameMaker。

GameMaker是一款2D遊戲製作引擎(也有3D,但是好像不怎麼樣)。有些人認為這是給小朋友玩的東西,不如一些大引擎。從編寫引擎的角度我沒法來評價是好是壞,但是作者以及我(強行沾光)都認為這款引擎只要掌握熟練,應該能滿足大部分2D遊戲的需求。比如大名鼎鼎的risk of rain據我所知就是用gamemaker做出來的。

要使用首先當然先得買啦不是么,最方便的購買途徑我認為是steam。

我們可以在steam里搜索到這款軟體。

這是我自己的steam賬號截圖,反正也沒什麼信息泄露。

gamemaker本體售價640RMB,如果要製作相應其他平台的遊戲則需要額外購買相應平台的版本,全套大保健有優惠哦,只需要5100RMB。

媽蛋,講真,作為這類型的軟體來說這個價格可能不算貴,但是我是覺得有點貴,等我找到工作再買。

好在,steam上有一個免費的standard的版本。

具體的區別請看GameMaker: Studio。

點擊免費獲取,下載以後你就可以在你的steam-庫-軟體里找到它啦!開始製作dream game的道路吧!

------------------------------------------------以下是更言歸正傳的內容------------------------------------------

打開後,我們選擇make,就可以看到上面的界面了,關於如何基礎使用我在這裡就不寫了,網上有很多中文的視頻及教程告訴你們怎麼使用。就算沒有那些教程,稍微摸索幾小時也能搞定個大半。

所以我們就跳過這一步,去下一步啦!

PS:友情建議,哦不,這是警告!這款軟體雖然可以用D&D(拖動按鈕)來上手,但是會有許許多多的問題以及功能問題(我就是,先是用按鈕,感覺邏輯好清晰啊,結果發現出來有問題也改不掉,網上都是用GML,所以只能也用GML)。所以一定要使用GML,也就是GameMaker語言。

GML是基於C++的好像,所以有這方面基礎的應該能很快上手。沒有任何編程基礎的(比如我),可以做個筆記,每個功能是如何寫的,到時候按照自己的設計思路先搬上去再慢慢改。

一切前提是,你得有個正確的設計思路才行。

-------------------------------------------------這真的是正傳--------------------------------------------------------

今天先來搞一個公認的新人殺手問題,平台跳躍!

我可能程序天賦實在太差,所以被殺了好幾天。國內的教程也是看得一知半解,解決不了問題。直到某一天突然發現了youtube的這位Shaun Spalding大哥。

這位大哥一口(北愛爾蘭的口音?)反正聽起來有些變扭,不過好在youtube有自動字幕,雖然這個視頻里to總是被翻成two等各種問題,不過至少結合一下還是能聽懂的。

視頻地址:youtube.com/watch? (我是絕對不會搬運到y優酷上的)

接下來是文字內容(就是精鍊視頻)

我們要做的就是這麼一個基礎的玩意兒。(知乎現在居然能傳GIF了?)

是不是看起來很基礎很制杖很簡單?好吧,我一開始也這麼認為的,但是殺了我好幾天。

1. 我們先要自定義一些變數。

我們先創建一個create事件。然後在create事件里創建一個code定義自己需要的變數。

第一步,我們要讓它跳起來,跳起來在編程里是什麼呢?跳起來就是Y坐標減小,沿著Y軸向上。那麼我們就先要定義一個vertical speed,一個jumpspeed,命名為vsp,jumpspeed(怎麼命名隨你喜好)。可以理解為沿著Y軸移動的速度。

第二步,跳起來我們肯定得下落,否則就變成無限往上突破天際了。所以我們要設置一個重力。但是這裡要注意的是,不能用遊戲自帶的gravity功能。具體為什麼我沒有完全聽明白視頻里作者說的是什麼意思,大致是說自帶的gravity有一些其他功能會導致我們無法控制(我嘗試過設置gravity,然後就會導致人物無法移動,只能上下跳),自己定義能更好的理解自己的object如何行為。所以我們這裡自己定義一個grav,可以簡單的把它理解成一個垂直向下的速度,這樣當跳到某一點時就會有一個速度把你拉回來。

第三步,我們還需要左右移動。那麼和第一步一樣,我們需要一個horizontal speed和一個movespeed。

多少值隨你喜好。

2.我們要定義一些操作輸入

在step事件里我們創建一個code。

我們需要把操作輸入和鍵盤結合起來,那麼我們就需要檢測鍵盤按鍵。

需要注意的是,這裡左和右需要有一個正負的區別。因為x變大是往右移動,而x變小是往左移動。(和下一步結合一下就能明白為什麼這麼做)

key_right按下時為1,不按時為0。key_left按下時為-1,不按時為0。

3.輸入這些操作會讓物體如何運動

首先我們先定義一個move。move就是向左或者向右。

接著我們需要一個移動的速度。速度我們前面定義了變數hsp和movespeed。那麼hsp是不是就等於方向 * 速度?

當move為1時,1*4,就是向右移動4個像素。當move為-1時,-1*4,就是向左移動4個像素。move為0,就是原地不動。

然後我們需要一個重力。

我們先考慮一下,如果重力這個速度在不斷的增加,那從很高的地方下落的時候是不是速度會越來越快然後一秒移動好幾百幀就像瞬移一樣。這樣體驗好像有點怪,從我們玩過的遊戲里來看,下落最後都是一個勻速的運動。雖然的確下落的速度是應該越來越快,但是如果快到無法接受那就很糟糕了。所以我們這裡先要設置一個上限。當vsp在多少值以內時,vsp就從重力中獲得加速度。

我們現在有了左右移動,有了重力,最後就是要設置跳了。

我們先要判斷,何時才能進行跳躍?這裡沒有二段跳,所以應該是當在地面上的時候,才允許跳躍對吧?這裡我們用place_meeting來檢測我們是否和地面有接觸。

這裡y+1是指「人物下方1個像素的東西是不是obj_wall」,如果是,我們就在地面上了。

(這裡我一開始也搞不清楚,我一直以為X,Y是sprite里的中心點。然後我試了兩次,一次是改成y,然後人物就無法跳起了。一次改成y+17,人物落地離地應該有16像素的距離。)

接著我們就要寫,當上面的判斷為真時,我們可以執行什麼動作?那當然就是可以跳躍啦。跳躍是什麼?就是在y變小嘛~

現在我們設定完跳和移動了,這些都只是設定而已,還沒有應用。接下來我們就要把設定完的這些數字給應用進去讓它變得有意義。

我們把這些傳給X和Y,告訴X和Y應該如何變化。

X就是根據HSP不斷變化,Y就是根據VSP不斷變化。

我們試一下,結果發現沒有任何和牆壁的碰撞,能穿過牆壁。我們接下來要加入碰撞檢測。

4.碰撞檢測

由於教程里說的比較長,我長話短說就是:我們需要的是

如圖這樣,而不是

這樣。所以我們要加入檢測,避免出現下圖的情況。

我們先做水平方向的檢測。

同樣,我們使用place_meeting這個功能。

這裡解釋一下為什麼是x+hsp,因為你的物體的移動速度是每次一個hsp,這句的意思是「如果接下來一個hsp的距離有牆」。如果用x而不用x+hsp的話,就會發生上面那張圖的情況。人會卡進牆壁一個hsp的長度。

然後我們還要加入這個,也有點搞。這裡再加上一個判斷,意思是「當我們下一個hsp就會碰到牆但是還沒有完全貼住牆,就像那個方向移動1個像素點,直到碰到牆壁」。我們不能在離牆壁一個hsp的距離就停下,這樣就太不真實了。

這裡的sign(hsp)是用來判定方向的(左和右)。sign(x)的作用是返回 x 的符號(-1,0,或1),我們向右移動是+,向左移動是-。

然後,當確定有牆時,我們的hsp就應該變為0,因為不能再向前移動了。

這整個一段的意思就是「如果在下一個hsp的距離檢測到牆,但是還沒有完全貼住牆,就像那個方向每次移動1個像素點,直到貼住牆,然後我們就停下。」

垂直方向的檢測也是一樣的。

這樣基本就搞定啦~

全部的就是這些代碼,我們就能做到一開始gif里的那樣運動物體了~

---------------------------------------------------結尾------------------------------------------------------------------

這就是最基本的平台跳躍的解決方法。

由於我也是剛搞明白沒幾天,所以還是有些一知半解。可能有些地方解釋的有些模糊不夠清楚,有些遺漏,甚至是解釋錯的非常離譜。希望各位看過這篇專欄文章能一起交流並提出寶貴的意見指正我的錯誤,也希望各位可以先看原視頻(可以避免有些地方被我萬一有錯誤的解釋誤導),更希望有大神能來指正一下我的錯誤,大家一起學習進步,謝謝!

如果我在表達上有讓人疑惑的地方,也請指出,謝謝!

並且,通過自學這個引擎,我充分了解到,我原來寫案子的時候考慮的還是太淺了(比如在跳的時候要考慮碰撞,考慮重力等等。而不是我想要設計一個怎樣的跳躍,我就告訴程序是怎麼樣的跳躍就好,每一個細節都要考慮到)。通過自己開發遊戲也能加深自己對遊戲設計的理解,強化細節。

接下來等我完全搞定如何用代碼寫攻擊的問題後,我會寫上(二)。

---------------------------------------------------------------------------------------------------------------------------

BTW,坐標上海失業找不到工作的策劃有人收走么,乾乾執行就好,能幹系統那就再好不過了,工資沒什麼要求,只是為了多積累經驗,各方面的經驗。


推薦閱讀:

關於遊戲概念設計,就業在美國公司面對一些項目設計產生的問題(如勝任設計科幻槍械機甲所需要具備的知識)?
在設計遊戲時,如何避免陷入具體執行細節中而忽略了整體設計?
氪金博士:我是如何放棄欣賞並愛上寶箱的
遊戲設計:理性、情感與信念

TAG:游戏开发 | 游戏设计 | GameMakerStudio |