摘要
上一章:[入門]GML常用UI之按鈕的制作1
本章涉及主要內(nèi)容:父對象的理解、與子對象的簡單控制
本章節(jié)實(shí)現(xiàn)內(nèi)容:在前章內(nèi)容之下翘簇,實(shí)現(xiàn)按鈕的按下與手動(dòng)控制彈起青伤,同時(shí)實(shí)現(xiàn)所有歸屬父對象的子對象的按下狀態(tài)是互斥的(此功能可以制作選擇中框等)
<span style="color: white">br
br
br</span>
上章解答
題目:現(xiàn)在情況是會(huì)自動(dòng)彈起埂伦,但是當(dāng)鼠標(biāo)在按鈕上的時(shí)候自動(dòng)彈起也會(huì)回歸到常規(guī)狀態(tài)(正確的應(yīng)該是移入狀態(tài)),有沒有一個(gè)方法在鼠標(biāo)在按鈕上時(shí)按鈕自動(dòng)彈起的時(shí)候它是處于移入狀態(tài)
思路:檢測鼠標(biāo)當(dāng)前所在的按鈕實(shí)例波闹,讓鼠標(biāo)所放置的實(shí)例的狀態(tài)恢復(fù)成移入狀態(tài)而不是普通狀態(tài)
如此我們需要在自動(dòng)恢復(fù)狀態(tài)的地方加入判斷鼠標(biāo)當(dāng)前所在的按鈕,【計(jì)時(shí)器0】內(nèi)的代碼修改為如下:
var button = instance_position(mouse_x, mouse_y, obj_button_father) //判斷并獲取鼠標(biāo)所在實(shí)例位置
if button > 0 btn_state = 1; //如果是當(dāng)前實(shí)例則切換成移入狀態(tài)
else btn_state = 0; //如果不是當(dāng)前實(shí)例則切換成普通狀態(tài)
以上就能正確識別鼠標(biāo)所處在具體哪個(gè)按鈕之上涛碑,下面開始正式教程
<span style="color: white">br
br
br</span>
思路分析
需求是:同一個(gè)父對象中精堕,2個(gè)子對象按鈕,1個(gè)自動(dòng)彈起蒲障,另外個(gè)需要手動(dòng)點(diǎn)擊才會(huì)彈起歹篓,同時(shí)相同子對象不同實(shí)例之間只有1個(gè)會(huì)被同時(shí)按下。
由此我們需要解決以下問題:
1.如何判斷是否需要自動(dòng)彈起
2.手動(dòng)彈起的按鈕的狀態(tài)判斷
3.相同子對象不同實(shí)例間按下狀態(tài)的互斥揉阎。
<span style="color: white">br
br
br</span>
實(shí)現(xiàn)過程
- 前提概要:父對象與子對象之間的關(guān)系上一章已經(jīng)說過庄撮,本章會(huì)有一些簡單的子對象引用和變量修改。
<span style="color: white">br
br</span>
不自動(dòng)彈起
1.新增字段
咱們這里既需要保留自動(dòng)彈起功能毙籽,又需要一個(gè)可持續(xù)選中的按鈕的話就需要針對不同的按鈕功能類型進(jìn)行識別洞斯,咱們在父對象obj_button_father的創(chuàng)建事件中新增一個(gè)變量來進(jìn)行區(qū)分:
btn_type = 0; //按鈕類型 0、點(diǎn)擊后選中 1坑赡、點(diǎn)擊會(huì)自動(dòng)彈起
<span style="color: white">br
br</span>
2.步事件區(qū)分判斷
已經(jīng)創(chuàng)建好的按鈕類型烙如,需要在步事件內(nèi)進(jìn)行區(qū)分判斷后才能用進(jìn)行下一步的功能實(shí)現(xiàn),如此obj_button_father的步事件中進(jìn)行一些改寫垮衷,代碼如下:
switch btn_type
{
case 0://以下是點(diǎn)擊后變?yōu)檫x中厅翔,再次點(diǎn)擊彈起(點(diǎn)擊其他實(shí)例也會(huì)彈起)
break;
case 1://以下是點(diǎn)擊會(huì)自動(dòng)彈起
if btn_state == 1 && mouse_check_button(mb_left) //當(dāng)鼠標(biāo)移入且被點(diǎn)擊時(shí)
{
btn_state = 2; //切換到點(diǎn)擊狀態(tài)
alarm_set(0, 3); //設(shè)置計(jì)時(shí)器計(jì)時(shí)為3幀
}
break;
}
以上,case 0既是我們即將增加按下的代碼
<span style="color: white">br
br</span>
3.按下的處理
按下的邏輯和之前幾乎相同搀突,唯一不同的就是咱們這里不需要讓他自動(dòng)彈起刀闷,那么就不需要在case 0的按下邏輯中添加計(jì)時(shí)器(上一章:計(jì)時(shí)器0的作用就是控制按鈕的自動(dòng)彈起),case 0中新增代碼如下:
case 0://以下是點(diǎn)擊后變?yōu)檫x中,再次點(diǎn)擊彈起(點(diǎn)擊其他實(shí)例也會(huì)彈起)
if btn_state == 1 && mouse_check_button(mb_left)//當(dāng)鼠標(biāo)移入且被點(diǎn)擊時(shí)
{
btn_state = 2;//切換到點(diǎn)擊狀態(tài)
}
break;
<span style="color: white">br
br</span>
4.再次點(diǎn)擊彈起
再次點(diǎn)擊彈起的前提必須是當(dāng)前按鈕處于被按下的情況下甸昏,那么只需要鼠標(biāo)點(diǎn)擊時(shí)判斷按鈕是否被按下即可顽分,同時(shí)需要注意的是為了避免多次觸發(fā)按下和取消按下狀態(tài),這里移入和被點(diǎn)擊對于每一次點(diǎn)擊都只需要觸發(fā)一次施蜜,而不需要多次觸發(fā)了卒蘸。所以mouse_check_button需要改成mouse_check_button_pressed(這兩個(gè)接口的區(qū)別上一章已經(jīng)說明)均唉,代碼修改如下:
case 0://以下是點(diǎn)擊后變?yōu)檫x中实檀,再次點(diǎn)擊彈起(點(diǎn)擊其他實(shí)例也會(huì)彈起)
if btn_state == 1 && mouse_check_button_pressed(mb_left)//當(dāng)鼠標(biāo)移入且被點(diǎn)擊時(shí)
{
btn_state = 2;//切換到點(diǎn)擊狀態(tài)
}
else if btn_state == 2 && mouse_check_button_pressed(mb_left)//當(dāng)按鈕狀態(tài)被按下且被點(diǎn)擊時(shí)
{
btn_state = 0;
}
break;
- 說明:以上其實(shí)已經(jīng)實(shí)現(xiàn)了相同子對象不同實(shí)例之間只有1個(gè)會(huì)被同時(shí)按下,因?yàn)樵趫?zhí)行按下【按鈕1】的時(shí)候幌绍,如果【按鈕2】是處于按下狀態(tài)的話修械,也會(huì)執(zhí)行else if里面的邏輯趾牧,簡意就是,每次點(diǎn)擊其實(shí)會(huì)對所有當(dāng)前父對象的子對象都單獨(dú)執(zhí)行一次獨(dú)立的代碼邏輯肯污。
<span style="color: white">br
br</span>
5.子對象的引用修改
按理來說翘单,功能已經(jīng)基本完成,但是現(xiàn)在遇到一個(gè)問題:現(xiàn)在不管刷多少個(gè)子對象他都是需要手動(dòng)點(diǎn)擊才會(huì)彈起的蹦渣,那么我們需要obj_button_child在點(diǎn)擊后才會(huì)彈起且obj_button_child1在點(diǎn)擊后3幀會(huì)自動(dòng)彈起就需要做區(qū)分了哄芜。
上面我們是通過字段btn_type來進(jìn)行識別的,那么只需要在子對象中對btn_type來進(jìn)行修改則可柬唯,因?yàn)?strong>btn_type在父對象中默認(rèn)是0认臊,那么obj_button_child則不需要有任何修改,剩下就需要在obj_button_child1中進(jìn)行修改了权逗。
首先在obj_button_child1中新建【創(chuàng)建】事件美尸,在這里其實(shí)可以直接把父對象的創(chuàng)建事件復(fù)制下來填進(jìn)去修改,但是若未來父對象有修改時(shí)斟薇,這里也會(huì)跟著修改會(huì)很麻煩师坎,由此我們在這里需要引用父對象【創(chuàng)建】的代碼后進(jìn)行修改btn_type的值,代碼如下:
event_inherited();//引用父對象相同事件內(nèi)的代碼
btn_type = 1;//修改按鈕類型
如此堪滨,就可非常簡單的把obj_button_child1的所有刷出來的實(shí)例改為自動(dòng)彈起的胯陋。
<span style="color: white">br
br</span>
6.點(diǎn)擊區(qū)域的識別
基本功能已經(jīng)搞定,可是在測試的時(shí)候發(fā)現(xiàn)一個(gè)問題:點(diǎn)擊按鈕沒什么問題袱箱,但是當(dāng)有按鈕按下時(shí)遏乔,點(diǎn)擊空白區(qū)域也會(huì)把按鈕給彈起來。
這問題產(chǎn)生的原因是由于mouse_check_button_pressed和mouse_check_button都是全局響應(yīng)導(dǎo)致的发笔,那么我們在響應(yīng)彈起邏輯時(shí)除了按鈕要處于按下狀態(tài)外還需要判斷鼠標(biāo)必須在按鈕上點(diǎn)擊才行盟萨,由此在父對象的【步】事件中做出了如下修改:
case 0://以下是點(diǎn)擊后變?yōu)檫x中,再次點(diǎn)擊彈起(點(diǎn)擊其他實(shí)例也會(huì)彈起)
var button = instance_position(mouse_x, mouse_y, obj_button_father) //判斷并獲取鼠標(biāo)所在實(shí)例位置
if btn_state == 1 && mouse_check_button_pressed(mb_left)//當(dāng)鼠標(biāo)移入且被點(diǎn)擊時(shí)
{
btn_state = 2;//切換到點(diǎn)擊狀態(tài)
}
else if btn_state == 2 && mouse_check_button_pressed(mb_left)&& button > 0//當(dāng)按鈕狀態(tài)被按下且被點(diǎn)擊時(shí)
{
btn_state = 0;//切換到普通狀態(tài)
}
break;
<span style="color: white">br
br</span>
7.彈起后的狀態(tài)優(yōu)化
和上一章一樣了讨,咱們在點(diǎn)擊彈起之后按鈕是恢復(fù)為普通狀態(tài)的捻激,在這里需要用類似的方法來處理為制轰,彈起后為鼠標(biāo)移入狀態(tài),由此父對象的【步】中的最終代碼如下:
switch btn_type
{
case 0://以下是點(diǎn)擊后變?yōu)檫x中胞谭,再次點(diǎn)擊彈起(點(diǎn)擊其他實(shí)例也會(huì)彈起)
var button = instance_position(mouse_x, mouse_y, obj_button_father) //判斷并獲取鼠標(biāo)所在實(shí)例位置
if btn_state == 1 && mouse_check_button_pressed(mb_left)//當(dāng)鼠標(biāo)移入且被點(diǎn)擊時(shí)
{
btn_state = 2;//切換到點(diǎn)擊狀態(tài)
}
else if btn_state == 2 && mouse_check_button_pressed(mb_left)&& button > 0//當(dāng)按鈕狀態(tài)被按下且被點(diǎn)擊時(shí)
{
btn_state = 0;//切換到普通狀態(tài)
if button.btn_state == 0 button.btn_state = 1;//切換到移入狀態(tài)
}
break;
case 1://以下是點(diǎn)擊會(huì)自動(dòng)彈起
if btn_state == 1 && mouse_check_button(mb_left) //當(dāng)鼠標(biāo)移入且被點(diǎn)擊時(shí)
{
btn_state = 2; //切換到點(diǎn)擊狀態(tài)
alarm_set(0, 3); //設(shè)置計(jì)時(shí)器計(jì)時(shí)為3幀
}
break;
}
<span style="color: white">br
br
br</span>
額外思考
現(xiàn)在功能已經(jīng)沒什么大問題了垃杖,但是出現(xiàn)另外個(gè)問題就是當(dāng)點(diǎn)擊obj_button_child1時(shí)obj_button_child被按下的按鈕也會(huì)彈起來,這明顯不是我們想要的丈屹,那么應(yīng)該怎么解決它呢调俘?
提示:針對按鈕進(jìn)行分組,并且在點(diǎn)擊的時(shí)候進(jìn)行判斷
<span style="color: white">br
br
br</span>
本次教程到此結(jié)束旺垒,有任何疑問和意見可以留言或者Q群詢問
下一章內(nèi)容:點(diǎn)擊按鈕后彈出界面
<span style="color: white">br
br</span>
教程中源文件 本次教程暫不提供源文件等本系列課程結(jié)束后統(tǒng)一提供下載
提取密碼: