国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 媒體動(dòng)畫(huà) > 正文

Director實(shí)例剖析:Director 動(dòng)態(tài)事件傳遞(1)

2024-09-08 19:27:04
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
director 動(dòng)態(tài)事件傳遞
   有時(shí)在director開(kāi)發(fā)過(guò)程中會(huì)遇到一些棘手的問(wèn)題,其中的原因之一是由于行為中包含有某些“陷阱”事件,比如點(diǎn)擊了一個(gè)帶有行為的角色,那么此點(diǎn)擊事件將停滯在此角色上,雖然你想讓其下的角色也能夠識(shí)別并對(duì)事件做出響應(yīng)。

   下面的樣本文件演示了這個(gè)問(wèn)題:如果你點(diǎn)擊了上面的角色,則只能獲得從上面角色發(fā)送來(lái)的消息,即使你的點(diǎn)擊碰巧發(fā)生在兩個(gè)角色交疊的范圍之內(nèi)。


播放,以上示例,需下載此插件。 點(diǎn)擊下載插件

   雖然你想讓鼠標(biāo)事件通過(guò)角色層向下傳遞,但由于director在行為中獲得事件的方式,這一點(diǎn)根本無(wú)法做到。例如,使用pass命令不會(huì)有任何效果。

   或許你會(huì)想到使用sendsprite命令告訴位于當(dāng)前角色下面的任何角色:一個(gè)事件已經(jīng)發(fā)生,需要做出適當(dāng)?shù)捻憫?yīng)。

   或許你想讓行為做這樣的事情:使用交疊測(cè)試來(lái)尋找其下的角色,即使被上方的角色遮擋,仍可以將點(diǎn)擊事件傳遞給下方的角色。

property pnintersectsprite

on beginsprite me
me .findlowersprite()
end beginsprite

on mouseup me
me .transmitclick()
end mouseup

on findlowersprite me
   nsprite = me . spritenum - 1
   rmyrect = sprite ( me . spritenum ). rect
   pnintersectsprite = 0
repeat with ntest = nsprite down to 1
     rtestrect = sprite (ntest). rect
     rintersect = intersect ( rmyrect, rtestrect )
if rintersect <> rect ( 0 , 0 , 0 , 0 ) then
       pnintersectsprite = ntest
exit repeat
end if
end repeat
end findlowersprite

on transmitclick me
if pnintersectsprite <> 0 then
sendsprite ( pnintersectsprite, #mouseup )
end if
end transmitclick

   初看起來(lái)這可能是一個(gè)具有可行性的解決方案,但如果你點(diǎn)擊下面樣本文件中的紅色矩形,將會(huì)看到仍然存在的一些問(wèn)題。


播放,以上示例,需下載此插件。 點(diǎn)擊下載插件

   看到了嗎?不管你在角色2中的何處點(diǎn)擊,角色1都非常“警惕”。也就是說(shuō),雖然沒(méi)有直接點(diǎn)擊兩角色交疊的地方,但程序認(rèn)為你這樣做了。

   這便是問(wèn)題所在,而要想解決此問(wèn)題,首先需要查明給出角色是否真的和一個(gè)附帶此行為的角色相交疊,其次必須確定當(dāng)事件被傳遞時(shí)下面的角色是否碰巧位于鼠標(biāo)下方,如果不是的話就不將此事件發(fā)送給下面的角色層。

property pnintersectsprite

on beginsprite me
me .findlowersprite()
end beginsprite

on mouseup me
me .transmitevent( #mouseup )
end mouseup

on findlowersprite me
   nsprite = me . spritenum - 1
   rmyrect = sprite ( me . spritenum ). rect
   pnintersectsprite = 0
repeat with ntest = nsprite down to 1
     rtestrect = sprite (ntest). rect
     rintersect = intersect ( rmyrect, rtestrect )
if rintersect <> rect ( 0 , 0 , 0 , 0 ) then
       pnintersectsprite = ntest
exit repeat
end if
end repeat
end findlowersprite

on transmitevent me , yevent
if pnintersectsprite <> 0 then
     pmousepoint = the mouseloc
     rtestrect = sprite (pnintersectsprite). rect
if pmousepoint. inside ( rtestrect ) then
sendsprite ( pnintersectsprite, yevent )
end if
end if
end transmitevent


   由于確定了單擊發(fā)生時(shí)鼠標(biāo)是否位于下層角色之上,上面的行為將給出更可靠的結(jié)果,下面的樣本文件動(dòng)態(tài)演示了這一點(diǎn)。


播放,以上示例,需下載此插件。 點(diǎn)擊下載插件

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 瓮安县| 大悟县| 古浪县| 通州市| 大新县| 宁德市| 西峡县| 义马市| 长顺县| 商都县| 海原县| 阿合奇县| 宝坻区| 图们市| 南江县| 兴隆县| 青州市| 太和县| 水城县| 桃江县| 松原市| 伊吾县| 扎鲁特旗| 门源| 靖安县| 曲周县| 咸丰县| 嘉峪关市| 上虞市| 威远县| 洪江市| 平顶山市| 新丰县| 珠海市| 文登市| 孝感市| 休宁县| 景泰县| 县级市| 民乐县| 华池县|