在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 | 遊戲開發 |