选择显示字体大小

director 动态事件传递(1)

director 动态事件传递
   有时在director开发过程中会遇到一些棘手的问题,其中的原因之一是由于行为中包含有某些“陷阱”事件,比如点击了一个带有行为的角色,那么此点击事件将停滞在此角色上,虽然你想让其下的角色也能够识别并对事件做出响应。

   下面的样本文件演示了这个问题:如果你点击了上面的角色,则只能获得从上面角色发送来的消息,即使你的点击碰巧发生在两个角色交叠的范围之内。


播放,以上示例,需下载此插件。点击下载插件

   虽然你想让鼠标事件通过角色层向下传递,但由于director在行为中获得事件的方式,这一点根本无法做到。例如,使用pass命令不会有任何效果。

   或许你会想到使用sendsprite命令告诉位于当前角色下面的任何角色:一个事件已经发生,需要做出适当的响应。

   或许你想让行为做这样的事情:使用交叠测试来寻找其下的角色,即使被上方的角色遮挡,仍可以将点击事件传递给下方的角色。

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

   初看起来这可能是一个具有可行性的解决方案,但如果你点击下面样本文件中的红色矩形,将会看到仍然存在的一些问题。


播放,以上示例,需下载此插件。点击下载插件

   看到了吗?不管你在角色2中的何处点击,角色1都非常“警惕”。也就是说,虽然没有直接点击两角色交叠的地方,但程序认为你这样做了。

   这便是问题所在,而要想解决此问题,首先需要查明给出角色是否真的和一个附带此行为的角色相交叠,其次必须确定当事件被传递时下面的角色是否碰巧位于鼠标下方,如果不是的话就不将此事件发送给下面的角色层。

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


   由于确定了单击发生时鼠标是否位于下层角色之上,上面的行为将给出更可靠的结果,下面的样本文件动态演示了这一点。


播放,以上示例,需下载此插件。点击下载插件

  


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons