[入門]GML常用UI之按鈕的制作1


摘要


本章涉及主要內(nèi)容:父對象和子對象、序列幀圖的使用、計(jì)時器
本章節(jié)實(shí)現(xiàn)內(nèi)容:按鈕的基礎(chǔ)功能:移入、點(diǎn)擊狀態(tài)、自動彈起


思路分析


我們的需求:<span style="color: #ff0000">制作2個不同的按鈕,鼠標(biāo)移入和點(diǎn)擊都會改變狀態(tài)</span>(暫不制作點(diǎn)擊后產(chǎn)生的效果)

由此我們得出以下需要解決的問題:
1.鼠標(biāo)移入后按鈕狀態(tài)改變
2.鼠標(biāo)移出后狀態(tài)按鈕恢復(fù)
3.鼠標(biāo)按下后狀態(tài)按鈕改變
4.鼠標(biāo)釋放后狀態(tài)會自動恢復(fù)
5.制作2個(N個)按鈕需要寫2次(N次)代碼?
<span style="color: white">br
br
br</span>


實(shí)現(xiàn)過程


新建工程

這里直接跳過,若還不會新建工程建議先學(xué)習(xí)官方教程。(新工程采用GML方式)
<span style="color: white">br
br</span>

加載精靈

1.資源準(zhǔn)備
  這里我們需要準(zhǔn)備2個按鈕的精靈資源,資源需要3個狀態(tài)分別為:常規(guī)時的樣子、鼠標(biāo)移入時的樣子,點(diǎn)擊(選中)時的樣子,依次以序列幀方式排列并且取名為<span style="color: #ff0000">study_button_strip3</span> 和<span style="color: #ff0000">study_button1_strip3</span>,以下是本章中使用的兩個素材(右鍵另存為即可).


study_button1_strip3

<span style="color: white">br
br</span>
2.資源導(dǎo)入
  直接把[步驟1]中所準(zhǔn)備的兩個按鈕資源拖入到工程內(nèi)(記住:不是文件夾內(nèi),要拖入到軟件已經(jīng)打開的工程里。),由于我們命名是以strip3,所以GMS2軟件會自動把資源切割為3等分。導(dǎo)入資源后把精靈名字后的_strip3都刪掉,變成study_button和study_button1

  • 名詞解釋:stripX
  • 當(dāng)圖片命名以時為_stripX(X代表一個數(shù)字),GMS2軟件會默認(rèn)該圖片為序列幀并且把軟件等分成X份,以X幀的形式放入同一個精靈內(nèi)。注意:只支持橫向,如果是兩排則不行。

<span style="color: white">br
br</span>

創(chuàng)建對象

這里直接跳過,若還不會新建對象建議先學(xué)習(xí)官方教程。(新對象命名為obj_button_father)

<span style="color: white">br
br</span>

變量申明

1.因?yàn)樾枰昝饕恍┎恍枰刂玫淖兞浚趯ο笾刑砑邮录簞?chuàng)建
  2.申明變量,這里我們暫時只需要用到一個判斷按鈕狀態(tài)的變量,所以在【創(chuàng)建】中建立一個狀態(tài)變量,如下在創(chuàng)建中添加:

btn_state = 0;  //按鈕狀態(tài) 0、正常 1、移入 2、點(diǎn)擊(選中)

<span style="color: white">br
br</span>

移入與移出


  1.因?yàn)樾枰袛嘁迫牒鸵瞥霎?dāng)前對象,所以在對象中添加兩個事件:鼠標(biāo)移入、鼠標(biāo)移出事件。
  2.在鼠標(biāo)移入對象時我們需要改變按鈕的狀態(tài)為移入狀態(tài),如下在【鼠標(biāo)移入】中添加:

btn_state = 1;  //切換移入狀態(tài)

3.在鼠標(biāo)移出對象時我們需要改變按鈕的狀態(tài)為移出狀態(tài),如下在【鼠標(biāo)移出】中添加:

btn_state = 0;  //切換移入狀態(tài)

<span style="color: white">br
br</span>

點(diǎn)擊效果

1.在對象中添加事件:步。
  2.在步事件中判斷鼠標(biāo)點(diǎn)擊后的狀態(tài)切換(也可以不用步事件,直接用鼠標(biāo)點(diǎn)擊事件,這里為了多寫一些方法就用【步】了),如下在【步】中添加:

if btn_state == 1 && mouse_check_button(mb_left)    //當(dāng)鼠標(biāo)移入且被點(diǎn)擊時
{
    btn_state = 2;  //切換到點(diǎn)擊狀態(tài)
}
  • 說明:mouse_check_button();
  • 這個語句是說當(dāng)鼠標(biāo)在點(diǎn)下后只要不松開就會一直執(zhí)行,若想只響應(yīng)鼠標(biāo)點(diǎn)擊那一瞬間的效果的話則需要用到mouse_check_button_pressed()語句;

<span style="color: white">br
br</span>

自動彈起效果

1.自動彈起這里就需要用到計(jì)時器,首先在點(diǎn)擊改變點(diǎn)擊狀態(tài)時設(shè)置計(jì)時器(如果每一幀都設(shè)置一次計(jì)時器的倒計(jì)時的話,這計(jì)時器將永不執(zhí)行,在這里使用mouse_check_button的方式就是為了一直設(shè)置計(jì)時器的方式來防止在鼠標(biāo)按下時執(zhí)行計(jì)時器而回到常規(guī)狀態(tài)),之前步事件中的代碼修改為:

if btn_state == 1 && mouse_check_button(mb_left)    //當(dāng)鼠標(biāo)移入且被點(diǎn)擊時
{
    btn_state = 2;  //切換到點(diǎn)擊狀態(tài)
    alarm_set(0, 3);    //設(shè)置計(jì)時器0的計(jì)時時間為3幀
}

2.計(jì)時器倒計(jì)時設(shè)置完畢后,就需要設(shè)置響應(yīng)事件了,由于之前【步】中設(shè)置的是0號計(jì)時器的倒計(jì)時所以需要添加一個【計(jì)時器0】,如圖所示:


<span style="color: white">br
br</span>
  3.在【計(jì)時器0】中寫的代碼會在之前設(shè)置的倒計(jì)時結(jié)束時激活其中的代碼,這里我們需要的是他在倒計(jì)時結(jié)束后就使按鈕回復(fù)初始狀態(tài),那么就在【計(jì)時器0】事件中添加:

btn_state = 0;  //轉(zhuǎn)換為常規(guī)狀態(tài)

<span style="color: white">br
br</span>

繪制圖像

1.之前的狀態(tài)已經(jīng)處理完畢,現(xiàn)在需要根據(jù)狀態(tài)來顯示出不同的狀態(tài),首先創(chuàng)建【繪制】事件(就是繪制的第一個事件,不選后面的GUI之類)。
  2.這里有個小技巧就是,之前狀態(tài)變量【state】是以0、1、2分別代替普通、移入、點(diǎn)擊狀態(tài)的,而我們的精靈的順序正好也是0、1、2代表的普通、移入、點(diǎn)擊狀態(tài),由此我們可以直接在【繪制】中添加如下代碼:

draw_self();    //繪制圖像本身
image_index = btn_state;    //根據(jù)狀態(tài)繪制當(dāng)前精靈的第幾幀

子對象添加


以上所有基本功能已經(jīng)實(shí)現(xiàn),下面需要添加子對象以引用之前所有的代碼
  1.新建2個對象:obj_button_child、obj_button_child1
  2.設(shè)置新對象的精靈和父對象如下圖:



<span style="color: white">br
br</span>

  • 說明:如此設(shè)置后所有子對象都會繼承父對象的所有特點(diǎn),包括事件、物理等一些你沒有針對子對象專門修改過的屬性。若要針對部分事件進(jìn)行添加的同時引用父對象事件則需要用到event_inherited()函數(shù)來引用父對象當(dāng)前事件的代碼,在本章中沒必要針對子對象些專門的代碼,所以就不做示范了,未來肯定會使用此方法的教程。
    <span style="color: white">br
    br
    br</span>

額外思考


現(xiàn)在情況是會自動彈起,但是當(dāng)鼠標(biāo)在按鈕上的時候自動彈起也會回歸到常規(guī)狀態(tài)(正確的應(yīng)該是移入狀態(tài)),有沒有一個方法在鼠標(biāo)在按鈕上時按鈕自動彈起的時候它是處于移入狀態(tài)的呢?

提示函數(shù):instance_position(mouse_x, mouse_y, obj_button_father)

<span style="color: white">br
br
br</span>

本次教程到此結(jié)束,有任何疑問和意見可以留言或者Q群詢問

下一章內(nèi)容:按鈕的選中狀態(tài),再次點(diǎn)擊取消狀態(tài)以及相同父對象情況下多個按鈕選中狀態(tài)互斥

<span style="color: white">br
br</span>
教程中源文件 本次教程暫不提供源文件等本系列課程結(jié)束后統(tǒng)一提供下載
提取密碼:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 摘要 上一章:[入門]GML常用UI之按鈕的制作1 本章涉及主要內(nèi)容:父對象的理解、與子對象的簡單控制本章節(jié)實(shí)現(xiàn)內(nèi)...
    丿我回來了閱讀 705評論 0 0
  • 之前寫過一篇瀏覽器事件的相關(guān)操作和事件運(yùn)行的原理——JavaScript瀏覽器事件解析。這一篇主要寫一些常用的事件...
    faremax閱讀 1,722評論 0 0
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,317評論 0 17
  • 1、窗體 1、常用屬性 (1)Name屬性:用來獲取或設(shè)置窗體的名稱,在應(yīng)用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調(diào)閱讀 4,762評論 0 11
  • 文字的作用在于表達(dá)一件事情,發(fā)表自己的觀點(diǎn),道明自己的感情,我曾經(jīng)認(rèn)為文字是一種很高大上的東西,以至于把他當(dāng)做是...
    絕跡偏鋒閱讀 291評論 0 4

友情鏈接更多精彩內(nèi)容