上一篇 | 下一篇

浅谈在director中运用组概念

发布: 2007-1-25 15:37 | 作者: 改将 | 来源: 奥古 | 查看: 150次

在director的开发中,我们经常会遇到这样的情况,电影需要在程序运行的任何时刻弹出各种面板,工具条,对话框等.这个时候我们通常有两种方法解决:
Zw XZ/aD|WDHx9g 奥古多媒体ae&G5\4K9mc;~ e
第一:使用miaw的方式,这是很多人常用的方式,而且现在mx20004改善了miaw的控制,应该是很好的一种解决方案.只是低版本的director窗口之间通讯不是很方便,这种方式不是本文讨论的范畴.这里就省略不说了. 奥古多媒体)q?h!K+il}

Eby-Ud8^^DG 第二:直接在通道中摆放,需要显示时打开精灵通道的显示即sprite(psprNum).visible=1,关闭时将精灵通道的显示属性设置为0(sprite(psprNum).visible=0).这种方式比较容易理解,不用打开新的窗口,通讯也比较方便.
`.yvp$[Dw T W*D"S6s
QJ2}\J,| 但是由于在director中只有一个时间轴,所以有时候就是是一个简单的"确认面板",都需要要3,4个精灵来实现,这样就涉及到多个了精灵通道,比如说:"确认面板"的底板放在100通道,"确认"按钮在101通道,"取消"按钮在102通道.这样打开确认面板时,需要将100,101,102的visible设置为true,关闭"确认面板"时,需要将100,101,102的visible设置为false,这样如果需要控制显示和关闭的精灵太多,程序控制起来就不是很方便.而且如果这样的面板太多的话,甚至程序中还有其他的比如下拉条菜单这样占用用很多通道的组件存在的时候.整个控制就可能比较混乱,而且如果程序设计不好的话,甚至改动精灵的通道号都需要改写程序,非常的麻烦. 奥古多媒体 a Q&g(v,F

2i2c5?A.Z(vG8eP 再来谈谈"组概念"在director中的应用. 奥古多媒体s/ZF Y'Z8zXA5m zm [
奥古多媒体(x6OK+\9y8y ZCY
在我的例子中,有四种水果,每种水平都有不同的数量了,它们在精灵通道中也是随便摆放的,我需要控制它们的显示与隐藏.
$L3_zD#s
.X0|*pH?(G 在电影开始的时候,建立一个全局的列表MovieGroupList
#O npV;EaX6bo [4?b global MovieGroupList
D&` EAg-q:_W$W3js on preparemovie
s1r8] W#}$V _movie.clearglobals() 奥古多媒体SS u Z$D l
MovieGroupList=[:] 奥古多媒体gVE'bY-`&@V
end
6VO+^.adkR 在每个自己需要控制的精灵上添加行为setSpr 奥古多媒体7fiR5f/~\{
global MovieGroupList 奥古多媒体E6h)hi*uH%]ivRj:zO
property pName,pGroup
Ix)O7b7LIGA on getpropertydescriptionlist me
9z)y)t.d'i*Zc tCurrentSpr=_player.currentSpriteNum
YlvV(M0B(]@c%W plist=[:]
i\Q\*SMbC setaprop plist,#pName,[#comment:"请输入精灵名称",#format:#string,#default:sprite(tCurrentSpr).member.name] 奥古多媒体9m5xt6l+V$tQ | W
setaprop plist,#pGroup,[#comment:"请输入精灵所属的组",#format:#string,#default:"Non"]
4`vMP8P-I*u return plist
7l_ ^iQ!JYm end
7ft;Th+U on beginsprite me 奥古多媒体1P&lU(\I{
getGroupMsg(me) 奥古多媒体(X&O9{$Y w,s'U(u,zC
end
s@0I\3@ on getGroupMsg me 奥古多媒体n1S-h [B"Q:?
tMovieList=getaprop(MovieGroupList,symbol(me.pGroup)) 奥古多媒体YfEsJ1|$g%f6P{
if voidP(tMovieList) then 奥古多媒体 P[DH+yG.j N(H
tlist=[me] 奥古多媒体Dad6T3p km1n
else 奥古多媒体[5h_ro"u H
tlist=tMovieList.duplicate()
.X.o0^f;bK!Y,Y [ tlist.append(me)
z"Jl-N$} end if
5Ri8e%Ba:dG setaProp MovieGroupList, symbol(me.pGroup),tlist
?aAH Aa1SK end
mp_+p2x ~1~6Z3Z+S on setVisible me,pGroupId,pboolean
*v5K-E5M6erX,C if pGroup=pGroupId then
)]'K%Bn/j.GT9{g sprite(me.spritenum).visible=pboolean 奥古多媒体9U&c.RAdUd0m
end if
*_h{1J te6T end 奥古多媒体^2v@ W c%D9P0m;k

8Ei$VmPJ 在属性设置面板中,如果这个精灵是属于apple的,就设置为appl就可以了.同理,如果是banana,就设置为bana.
}K2d.Nas6fpz
:b/d.O-H,as1Nn/T 这样,当我们需要控制一个组的显示或关闭时,比如说appl组的,我们就只需要使用
yH7W4Qv^r sendallSprites(#setVisible,"appl",1)或sendallSprites(#setVisible,"appl",0)就可以了
$r;QyJ1s-}`&oQUn 同理如果要控制banana组的显示或关闭,就使用
kH TqH D ~4iu;b sendallSprites(#setVisible,"bana",1)或sendallSprites(#setVisible,"bana",0)
0z"h7n l d1w7g 奥古多媒体u8L d8[.@'fE
当然,因为我们在beginsprite的时候其实已经收集的所有的精灵通道信息.写一个全局函数setGroupvisible 奥古多媒体$T3NC])a9BFDz
on setGroupvisible pGroupId,pBoolean 奥古多媒体_#@7tT"`%c'^'V0z
tPropertyList=getaprop(MovieGroupList,symbol(pGroupId)) 奥古多媒体a_ i"~ |2Qp!NI
tBoolean=pBoolean 奥古多媒体M)}7X U8p"eD|
if voidP(tPropertyList) then 奥古多媒体z/ZC z'R
return 0
'pN/t-S |*A `P else
8^r(FD:c'{zx1v repeat with i=1 to tPropertyList.count
#WKLU`%Y4V sprite(tPropertyList[i].spriteNum).setVisible(pGroupId,tBoolean)
0PWQ io end repeat 奥古多媒体-Sq+A c$M"N cbDMf Y
end if 奥古多媒体 \y,q do6i:t
end 奥古多媒体3{$x0dy\ku,Mo
这样,我们就不必要使用sendAllsprites向所有的精灵通道发信息.而使用下面的形式就可以了.
1U-} x3uKvHK
E jeZ'}OW 控制苹果组的显示和关闭 奥古多媒体 Cn)fI/YAJ N3Q x
setGroupvisible("appl",0)或setGroupvisible("appl",1) 奥古多媒体/S9@yhJ8S
奥古多媒体0i6}8M q f9J
当然,我们在这里只对特定的组进行了关闭和显示的控制的讨论,作为抛砖引玉之用.你完全可以利用它来做更多的事情. 奥古多媒体8~%I0fD8`QL(Y`O

"C*q eQEj2Qt 附源程序:
!t6_1la TVa http://www.aougu.net/bbs/index.php?...::dl&pid=175776

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


音乐
落叶 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 如果爱能早些说出来
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 为你而活 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
城府 假如 花海 兰亭序 爱太痛 舍不得 你若成风 女人如烟 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错