浅谈在director中运用组概念
作者:改将
在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[i].spriteNum).setVisible(pGroupId,tBoolean)
end repeat
end if
end
这样,我们就不必要使用sendAllsprites向所有的精灵通道发信息.而使用下面的形式就可以了.
控制苹果组的显示和关闭
setGroupvisible("appl",0)或setGroupvisible("appl",1)
当然,我们在这里只对特定的组进行了关闭和显示的控制的讨论,作为抛砖引玉之用.你完全可以利用它来做更多的事情.
附源程序如下:
Shockwave 动画:
作者:改将
在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[i].spriteNum).setVisible(pGroupId,tBoolean)
end repeat
end if
end
这样,我们就不必要使用sendAllsprites向所有的精灵通道发信息.而使用下面的形式就可以了.
控制苹果组的显示和关闭
setGroupvisible("appl",0)或setGroupvisible("appl",1)
当然,我们在这里只对特定的组进行了关闭和显示的控制的讨论,作为抛砖引玉之用.你完全可以利用它来做更多的事情.
附源程序如下:
Shockwave 动画:
回复Comments
{commenttime}{commentauthor}
{CommentUrl}
{commentcontent}