摘要
上一章:[入門]GML常用UI之按鈕的制作1
本章涉及主要內(nèi)容:父對象的理解、與子對象的簡單控制
本章節(jié)實現(xiàn)內(nèi)容:在前章內(nèi)容之下,實現(xiàn)按鈕的按下與手動控制彈起,同時實現(xiàn)所有歸屬父對象的子對象的按下狀態(tài)是互斥的(此功能可以制作選擇中框等)
<span style="color: white">br
br
br</span>
上章解答
題目:現(xiàn)在情況是會自動彈起,但是當鼠標在按鈕上的時候自動彈起也會回歸到常規(guī)狀態(tài)(正確的應該是移入狀態(tài)),有沒有一個方法在鼠標在按鈕上時按鈕自動彈起的時候它是處于移入狀態(tài)
思路:檢測鼠標當前所在的按鈕實例,讓鼠標所放置的實例的狀態(tài)恢復成移入狀態(tài)而不是普通狀態(tài)
如此我們需要在自動恢復狀態(tài)的地方加入判斷鼠標當前所在的按鈕,【計時器0】內(nèi)的代碼修改為如下:
var button = instance_position(mouse_x, mouse_y, obj_button_father) //判斷并獲取鼠標所在實例位置
if button > 0 btn_state = 1; //如果是當前實例則切換成移入狀態(tài)
else btn_state = 0; //如果不是當前實例則切換成普通狀態(tài)
以上就能正確識別鼠標所處在具體哪個按鈕之上,下面開始正式教程
<span style="color: white">br
br
br</span>
思路分析
需求是:同一個父對象中,2個子對象按鈕,1個自動彈起,另外個需要手動點擊才會彈起,同時相同子對象不同實例之間只有1個會被同時按下。
由此我們需要解決以下問題:
1.如何判斷是否需要自動彈起
2.手動彈起的按鈕的狀態(tài)判斷
3.相同子對象不同實例間按下狀態(tài)的互斥。
<span style="color: white">br
br
br</span>
實現(xiàn)過程
- 前提概要:父對象與子對象之間的關(guān)系上一章已經(jīng)說過,本章會有一些簡單的子對象引用和變量修改。
<span style="color: white">br
br</span>
不自動彈起
1.新增字段
咱們這里既需要保留自動彈起功能,又需要一個可持續(xù)選中的按鈕的話就需要針對不同的按鈕功能類型進行識別,咱們在父對象obj_button_father的創(chuàng)建事件中新增一個變量來進行區(qū)分:
btn_type = 0; //按鈕類型 0、點擊后選中 1、點擊會自動彈起
<span style="color: white">br
br</span>
2.步事件區(qū)分判斷
已經(jīng)創(chuàng)建好的按鈕類型,需要在步事件內(nèi)進行區(qū)分判斷后才能用進行下一步的功能實現(xiàn),如此obj_button_father的步事件中進行一些改寫,代碼如下:
switch btn_type
{
case 0://以下是點擊后變?yōu)檫x中,再次點擊彈起(點擊其他實例也會彈起)
break;
case 1://以下是點擊會自動彈起
if btn_state == 1 && mouse_check_button(mb_left) //當鼠標移入且被點擊時
{
btn_state = 2; //切換到點擊狀態(tài)
alarm_set(0, 3); //設置計時器計時為3幀
}
break;
}
以上,case 0既是我們即將增加按下的代碼
<span style="color: white">br
br</span>
3.按下的處理
按下的邏輯和之前幾乎相同,唯一不同的就是咱們這里不需要讓他自動彈起,那么就不需要在case 0的按下邏輯中添加計時器(上一章:計時器0的作用就是控制按鈕的自動彈起),case 0中新增代碼如下:
case 0://以下是點擊后變?yōu)檫x中,再次點擊彈起(點擊其他實例也會彈起)
if btn_state == 1 && mouse_check_button(mb_left)//當鼠標移入且被點擊時
{
btn_state = 2;//切換到點擊狀態(tài)
}
break;
<span style="color: white">br
br</span>
4.再次點擊彈起
再次點擊彈起的前提必須是當前按鈕處于被按下的情況下,那么只需要鼠標點擊時判斷按鈕是否被按下即可,同時需要注意的是為了避免多次觸發(fā)按下和取消按下狀態(tài),這里移入和被點擊對于每一次點擊都只需要觸發(fā)一次,而不需要多次觸發(fā)了。所以mouse_check_button需要改成mouse_check_button_pressed(這兩個接口的區(qū)別上一章已經(jīng)說明),代碼修改如下:
case 0://以下是點擊后變?yōu)檫x中,再次點擊彈起(點擊其他實例也會彈起)
if btn_state == 1 && mouse_check_button_pressed(mb_left)//當鼠標移入且被點擊時
{
btn_state = 2;//切換到點擊狀態(tài)
}
else if btn_state == 2 && mouse_check_button_pressed(mb_left)//當按鈕狀態(tài)被按下且被點擊時
{
btn_state = 0;
}
break;
- 說明:以上其實已經(jīng)實現(xiàn)了相同子對象不同實例之間只有1個會被同時按下,因為在執(zhí)行按下【按鈕1】的時候,如果【按鈕2】是處于按下狀態(tài)的話,也會執(zhí)行else if里面的邏輯,簡意就是,每次點擊其實會對所有當前父對象的子對象都單獨執(zhí)行一次獨立的代碼邏輯。
<span style="color: white">br
br</span>
5.子對象的引用修改
按理來說,功能已經(jīng)基本完成,但是現(xiàn)在遇到一個問題:現(xiàn)在不管刷多少個子對象他都是需要手動點擊才會彈起的,那么我們需要obj_button_child在點擊后才會彈起且obj_button_child1在點擊后3幀會自動彈起就需要做區(qū)分了。
上面我們是通過字段btn_type來進行識別的,那么只需要在子對象中對btn_type來進行修改則可,因為btn_type在父對象中默認是0,那么obj_button_child則不需要有任何修改,剩下就需要在obj_button_child1中進行修改了。
首先在obj_button_child1中新建【創(chuàng)建】事件,在這里其實可以直接把父對象的創(chuàng)建事件復制下來填進去修改,但是若未來父對象有修改時,這里也會跟著修改會很麻煩,由此我們在這里需要引用父對象【創(chuàng)建】的代碼后進行修改btn_type的值,代碼如下:
event_inherited();//引用父對象相同事件內(nèi)的代碼
btn_type = 1;//修改按鈕類型
如此,就可非常簡單的把obj_button_child1的所有刷出來的實例改為自動彈起的。
<span style="color: white">br
br</span>
6.點擊區(qū)域的識別
基本功能已經(jīng)搞定,可是在測試的時候發(fā)現(xiàn)一個問題:點擊按鈕沒什么問題,但是當有按鈕按下時,點擊空白區(qū)域也會把按鈕給彈起來。
這問題產(chǎn)生的原因是由于mouse_check_button_pressed和mouse_check_button都是全局響應導致的,那么我們在響應彈起邏輯時除了按鈕要處于按下狀態(tài)外還需要判斷鼠標必須在按鈕上點擊才行,由此在父對象的【步】事件中做出了如下修改:
case 0://以下是點擊后變?yōu)檫x中,再次點擊彈起(點擊其他實例也會彈起)
var button = instance_position(mouse_x, mouse_y, obj_button_father) //判斷并獲取鼠標所在實例位置
if btn_state == 1 && mouse_check_button_pressed(mb_left)//當鼠標移入且被點擊時
{
btn_state = 2;//切換到點擊狀態(tài)
}
else if btn_state == 2 && mouse_check_button_pressed(mb_left)&& button > 0//當按鈕狀態(tài)被按下且被點擊時
{
btn_state = 0;//切換到普通狀態(tài)
}
break;
<span style="color: white">br
br</span>
7.彈起后的狀態(tài)優(yōu)化
和上一章一樣,咱們在點擊彈起之后按鈕是恢復為普通狀態(tài)的,在這里需要用類似的方法來處理為,彈起后為鼠標移入狀態(tài),由此父對象的【步】中的最終代碼如下:
switch btn_type
{
case 0://以下是點擊后變?yōu)檫x中,再次點擊彈起(點擊其他實例也會彈起)
var button = instance_position(mouse_x, mouse_y, obj_button_father) //判斷并獲取鼠標所在實例位置
if btn_state == 1 && mouse_check_button_pressed(mb_left)//當鼠標移入且被點擊時
{
btn_state = 2;//切換到點擊狀態(tài)
}
else if btn_state == 2 && mouse_check_button_pressed(mb_left)&& button > 0//當按鈕狀態(tài)被按下且被點擊時
{
btn_state = 0;//切換到普通狀態(tài)
if button.btn_state == 0 button.btn_state = 1;//切換到移入狀態(tài)
}
break;
case 1://以下是點擊會自動彈起
if btn_state == 1 && mouse_check_button(mb_left) //當鼠標移入且被點擊時
{
btn_state = 2; //切換到點擊狀態(tài)
alarm_set(0, 3); //設置計時器計時為3幀
}
break;
}
<span style="color: white">br
br
br</span>
額外思考
現(xiàn)在功能已經(jīng)沒什么大問題了,但是出現(xiàn)另外個問題就是當點擊obj_button_child1時obj_button_child被按下的按鈕也會彈起來,這明顯不是我們想要的,那么應該怎么解決它呢?
提示:針對按鈕進行分組,并且在點擊的時候進行判斷
<span style="color: white">br
br
br</span>
本次教程到此結(jié)束,有任何疑問和意見可以留言或者Q群詢問
下一章內(nèi)容:點擊按鈕后彈出界面
<span style="color: white">br
br</span>
教程中源文件 本次教程暫不提供源文件等本系列課程結(jié)束后統(tǒng)一提供下載
提取密碼: