| 
 在director的开发中,我们经常会遇到这样的情况,电影需要在程序运行的任何时刻弹出各种面板,工具条,对话框等.这个时候我们通常有两种方法解决: 
第一:使用miaw的方式,这是很多人常用的方式,而且现在mx20004改善了miaw的控制,应该是很好的一种解决方案.只是低版本的director窗口之间通讯不是很方便,这种方式不是本文讨论的范畴.这里就省略不说了. 
第二:直接在通道中摆放,需要显示时打开精灵通道的显示即sprite(psprNum).visible=1,关闭时将精灵通道的显示属性设置为0(sprite(psprNum).visible=0).这种方式比较容易理解,不用打开新的窗口,通讯也比较方便. 
     但是由于在director中只有一个时间轴,所以有时候就是是一个简单的"确认面板",都需要要3,4个精灵来实现,这样就涉及到多个了精灵通道,比如说:"确认面板"的底板放在100通道,"确认"按钮在101通道,"取消"按钮在102通道.这样打开确认面板时,需要将100,101,102的visible设置为true,关闭"确认面板"时,需要将100,101,102的visible设置为false,这样如果需要控制显示和关闭的精灵太多,程序控制起来就不是很方便.而且如果这样的面板太多的话,甚至程序中还有其他的比如下拉条菜单这样占用用很多通道的组件存在的时候.整个控制就可能比较混乱,而且如果程序设计不好的话,甚至改动精灵的通道号都需要改写程序,非常的麻烦. 
    再来谈谈"组概念"在director中的应用. 
    在我的例子中,有四种水果,每种水平都有不同的数量了,它们在精灵通道中也是随便摆放的,我需要控制它们的显示与隐藏. 
    在电影开始的时候,建立一个全局的列表MovieGroupList 
global MovieGroupList 
on preparemovie 
  _movie.clearglobals() 
   MovieGroupList=[:] 
end 
    在每个自己需要控制的精灵上添加行为setSpr 
global MovieGroupList 
property pName,pGroup 
on getpropertydescriptionlist me 
  tCurrentSpr=_player.currentSpriteNum 
  plist=[:] 
  setaprop plist,#pName,[#comment:"请输入精灵名称",#format:#string,#default:sprite(tCurrentSpr).member.name] 
  setaprop plist,#pGroup,[#comment:"请输入精灵所属的组",#format:#string,#default:"Non"] 
  return plist 
end 
on beginsprite me 
  getGroupMsg(me) 
end 
on getGroupMsg me    
  tMovieList=getaprop(MovieGroupList,symbol(me.pGroup)) 
  if voidP(tMovieList) then 
    tlist=[me] 
  else 
    tlist=tMovieList.duplicate() 
    tlist.append(me) 
  end if 
  setaProp MovieGroupList, symbol(me.pGroup),tlist 
end 
on setVisible me,pGroupId,pboolean 
  if pGroup=pGroupId then 
    sprite(me.spritenum).visible=pboolean 
  end if 
end 
在属性设置面板中,如果这个精灵是属于apple的,就设置为appl就可以了.同理,如果是banana,就设置为bana. 这样,当我们需要控制一个组的显示或关闭时,比如说appl组的,我们就只需要使用 
sendallSprites(#setVisible,"appl",1)或sendallSprites(#setVisible,"appl",0)就可以了 
同理如果要控制banana组的显示或关闭,就使用 
sendallSprites(#setVisible,"bana",1)或sendallSprites(#setVisible,"bana",0) 当然,因为我们在beginsprite的时候其实已经收集的所有的精灵通道信息.写一个全局函数setGroupvisible  
on setGroupvisible pGroupId,pBoolean 
  tPropertyList=getaprop(MovieGroupList,symbol(pGroupId)) 
  tBoolean=pBoolean 
  if voidP(tPropertyList) then 
    return 0 
  else 
    repeat with i=1 to tPropertyList.count 
      sprite(tPropertyList.spriteNum).setVisible(pGroupId,tBoolean) 
    end repeat    
  end if  
end 
这样,我们就不必要使用sendAllsprites向所有的精灵通道发信息.而使用下面的形式就可以了. 
控制苹果组的显示和关闭 
setGroupvisible("appl",0)或setGroupvisible("appl",1) 当然,我们在这里只对特定的组进行了关闭和显示的控制的讨论,作为抛砖引玉之用.你完全可以利用它来做更多的事情. 
 
  
 |