在GMS2中製作對話系統(2/2)
本文為Indienova的Linpean 編寫並授權轉載
原文地址:簡單的對話框體(上)
該教程由油管上的妹子FriendlyCosmonaut原創,能翻牆的盡量看原版吧:Textbox Tutorial。
下面這個是B站的搬運版
【GameMaker Studio 2生肉教程】-【GMS2製作RPG對話框系統】-【作者FriendlyCosmonaut】 http://link.zhihu.com/?target=https%3A//www.bilibili.com/video/av12120494/代碼託管在Github。實現的效果為:
其實基本的邏輯已經在簡單的對話框體(上)實現了,這一節主要是
- 將代碼重構成可以復用,並且更加抽象模塊化
- 多頁文本對話和跳過對話的功能
- 打字效果(逐字出現的效果)
- 然後美化下對話框的表現:外邊框,字體變色
多頁對話文本和跳過某頁對話的功能
將obj_susan的step事件的對話文本,直接改成變數myText
然後在create事件使用list結構對該變數聲明和賦值,這樣我們不必直接去step事件一一修改對話文本,可以直接在create對myText變數直接修改,其他地方引用變數。
注意這裡的聲明方式,list[index] = strings。同樣的index的值將作為我們對話框的頁碼來使用:第一段對話,第二段對話...
既然有了多段對話,那麼在obj_textbox的draw事件內,也要分別連續繪製不同的頁碼的文本。
將Draw事件內的引用的text變數,改為text[page]
同樣的,由於使用page變數,在create也對page變數進行聲明和賦值
然後為obj_textbox添加step事件,並且進行按鍵檢測,檢測到了則跳過當前頁的對話(即page變數增加1)。
運行遊戲,按下空格鍵能看到如下效果
修正對話框對象的創建條件為,按下space時,並且與NPC對象(如obj_susan)發生碰撞.
在obj_susan的step事件內,添加if語句
修正page變數的大小會超過文本text(list)的「長度」,即你一直按下空格,當對話框顯示完最後一句話後,就銷毀該對話框對象。
然後設置creator.myTextbox變數為空。
為什麼這麼做?
因為在NPC對象創建實例時,會判斷自己的myTextBox存不存在,一旦存在它就不會創建第二個了,這個必須將已經被銷毀的myTextBox變數設置為空,這樣當再次觸發創建NPC對象的TextBox時,TextBox才會被創建出來。
首先在obj_Textbox中聲明creator變數為noone。然後在創建obj_Textbox時,將obj_Textbox的text變數換成NPC自己的對話文本,並且設置該obj_Textbox的creator(創建者)為自己。
這樣在最後,就可以通過creator索引,在obj_Textbox的step事件中,設置NPC對象的myTextBox變數為空了(是不是很魔法,這個騷操作,真是給跪了,這個油管妹子。)
這裡有一個優化的操作,作者不希望,當出現最後一句話後,再次按下空格不是銷毀文本對話框(obj_Textbox),然後又馬上創建新一個文本對話框(obj_Textbox)出現第一句話,而是這一次的空格僅僅只是起到銷毀文本框的作用,這裡有個細節操作,就是我們不知道GameMakerStudio2的代碼運行順序
所以我們不在運行檢測到space空格按下的這一幀中立即將myTextbox變數設置為空,而是使用計時器alarm(並且是NPC對象的alarm變數)來移除myTextbox,就會使得這一次空格按下僅僅只是銷毀文本對話框,而不會立即創建新的文本對話框了。
打字效果(逐字出現的效果)
為了實現逐字出現的文本對話框的效果,這裡的方式是對展現的文本的內容進行處理。
在obj_Textbox的step事件中,創建一個臨時變數textPart,並使用string_copy()函數來從指定的位置,複製指定個數的字元成為新的文本。
先在obj_Textbox的create事件中創建charCount變數(charCount每幀增加的數量可以作為逐字出現的速度來調節)
為了方便調試,查看結果,我們可以為obj_textbox對象添加draw_GUI事件,用顯示當前繪製了多少個字元
運行遊戲,即可觸發對話,即可看到逐字出現的效果,但是可以看到左上的charCount數量在不斷增加,沒有達到本頁對話的最大字元數時停下,這時比較消耗性能的。
為了修正這個問題
字體變色效果
在NPC對象(obj_susan)的create事件創建myname變數
再在對話框中,創建name變數
在創建對話框時,將NPC的名字變數賦值給對話框
然後修改繪製文本的代碼
為了美觀緣故,這裡設置了水平邊距和垂直邊距,並且使姓名居中顯示
運行遊戲,即可看到效果。
NPC對話模塊化
即創建一個可以對話的NPC父物體,其他NPC對象都從該對象繼承。
在資源樹上選中obj_susan,拿下<crtrl+d>快捷鍵複製一個對象,重命名為obj_parent_talking。
然後將其精靈設置為空。
接著將其create事件中的myName和myText變數都設置為空(這些內容將交給繼承它的NPC對象來填充,畢竟不同的NPC有不同的名稱,有不同的姓名)
然後對原來的NPC對象(obj_susan)進行處理
如果我們需要在繼承obj_parent_talker的NPC對象另外表現出不同的屬性,那麼可以繼續添加step事件,並在書寫自己的屬性代碼前,添加繼承函數event_inherited()
如此以來,我們就可以自由的創建更多的NPC了,只需要添加NPC自己的對話和姓名,而對話的邏輯和功能,都交給obj_parent_talker對象了。例如我們可以創建一個obj_bob對象,設置精靈,對話,姓名。
同時為了方便沒有耐心看劇情的玩家,我們再添加一個小功能,在播放文字未完成時,再次按下空格,則將當前頁的所有的文字全部顯示出來。
運行遊戲,則可以看到效果。
美化對話框
先獲得對話框高度
再繪製一個包裹對話框外邊緣的矩形邊框
運行遊戲,則可看到文章前貼出的效果圖
到此,FriendlyCosmonaut妹子的對話系統教程完結了。
推薦閱讀:
TAG:GameMakerStudio | 遊戲開發 |