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


摘要


上一章:[入門]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_pressedmouse_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)一提供下載
提取密碼:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彩库,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子袖牙,更是在濱河造成了極大的恐慌侧巨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞭达,死亡現(xiàn)場離奇詭異,居然都是意外死亡皇忿,警方通過查閱死者的電腦和手機(jī)畴蹭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳍烁,“玉大人叨襟,你說我怎么就攤上這事♂;模” “怎么了糊闽?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爹梁。 經(jīng)常有香客問我右犹,道長,這世上最難降的妖魔是什么姚垃? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任念链,我火速辦了婚禮,結(jié)果婚禮上积糯,老公的妹妹穿的比我還像新娘掂墓。我一直安慰自己,他們只是感情好看成,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布君编。 她就那樣靜靜地躺著,像睡著了一般川慌。 火紅的嫁衣襯著肌膚如雪吃嘿。 梳的紋絲不亂的頭發(fā)上偿荷,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音唠椭,去河邊找鬼跳纳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贪嫂,可吹牛的內(nèi)容都是我干的寺庄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼力崇,長吁一口氣:“原來是場噩夢啊……” “哼斗塘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亮靴,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤馍盟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后茧吊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贞岭,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年搓侄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞄桨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讶踪,死狀恐怖芯侥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乳讥,我是刑警寧澤柱查,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站云石,受9級特大地震影響唉工,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留晚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一酵紫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧错维,春花似錦奖地、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隆判,卻和暖如春犬庇,著一層夾襖步出監(jiān)牢的瞬間僧界,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工臭挽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捂襟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓欢峰,卻偏偏與公主長得像葬荷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子纽帖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 摘要 本章涉及主要內(nèi)容:父對象和子對象宠漩、序列幀圖的使用、計(jì)時(shí)器本章節(jié)實(shí)現(xiàn)內(nèi)容:按鈕的基礎(chǔ)功能:移入懊直、點(diǎn)擊狀態(tài)扒吁、自動(dòng)...
    丿我回來了閱讀 682評論 0 0
  • 1、窗體 1室囊、常用屬性 (1)Name屬性:用來獲取或設(shè)置窗體的名稱雕崩,在應(yīng)用程序中可通過Name屬性來引用窗體。 ...
    Moment__格調(diào)閱讀 4,553評論 0 11
  • 一波俄、簡介 <<UIButton(按鈕) : 既能顯示文字晨逝,又能顯示圖片,還能隨時(shí)調(diào)整內(nèi)部圖片和文字的位置懦铺,實(shí)現(xiàn)了監(jiān)...
    無邪8閱讀 5,654評論 0 2
  • style 修飾width 寬度height 高度title 想說明的text-align 水平對齊...
    蒲公英_前端開發(fā)者閱讀 9,210評論 4 58
  • 文件下載時(shí),中文名亂碼處理 //文件名中文亂碼fileName = new String(fileName.get...
    徐俊閱讀 152評論 0 1