上一篇 | 下一篇

浅谈怎样在Director中建立更敏捷的系统

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

怎么在director中建立易阅读,且易扩展的系统一直是Director程序员们努力追求的目标之一。但Director只是一门脚本语言,对面向对象技术支持并不不是很完善,所以很多在C++,java中可以运用的方法,及程序设计思想,在director中是无法直接运用的,在这一点上flash做的比director好。奥古多媒体 I%Y%{M f Xf9N,~
奥古多媒体;eKEVcmIDC
但是这并不意味着director完全不能借鉴他们的的程序设计思路,在设计模式中最常用的观察者模式和委托事件模式我们就可以很好的借用到director中来。
v;}*Jhuq
~H#LmYDm'~ 我改写了director mx2004目录下的一个学习的例子C:\Program Files\Macromedia\Director MX 2004\Learning\Lingo\lingo QT and Flash.dir。对比我上传的例子,你应该会有一个比较清晰的理解。
K L#|3G/DT%Yw
r7hS)vo2G&w+F 在我的例子中,关键是EventObj对象。其具体程序如下:
T7Qd HSF O f,q ----------------------------------------------------------------------------------奥古多媒体?%zb'd~ V4l
property ObjserverList --观察者模式列表
7kq;L2ob/` [ on new me奥古多媒体*^%BqOf `?#R1Nj!p
ObjserverList=[]奥古多媒体]-g!NK%U3U U*c'k
return me
g:p.{IHA1n end
T;} kYK~/w-W s~
$J sy*R_ye? on addListenerObj me,EventName,RegSpr --注册的精灵和其注册的事件奥古多媒体SzW j-l
tchange=0奥古多媒体,U;}tBJ|!H
listLength=objServerList.count奥古多媒体t ]$d7C CC!yu^
repeat with i=1 to listLength
^_gmJo if ObjServerList[i].getPropat(1)=symbol(EventName) then --事件列表中有这个精灵
8J7q3ANx0e(l4`8e if objServerList[i][symbol(EventName)].getOne(regSpr)=0 then
Z9h([d9]a] D objServerList[i][symbol(EventName)].append(regSpr) 奥古多媒体U,n/z4?7_(@[
end if
e FZ@ ib M9` tchange=1
Lmh*G6cO end if奥古多媒体nG$`D!B,UTB4N
end repeat
"ax-^ K;U2c }8s(R if tchange=0 then
T,_&uI [ tlist=[:]奥古多媒体|W;{3M6G l,]/v];?
tlist.setaprop(symbol(EventName),[])
gW\Kz c,ln)q*o objServerList.append(tlist)
PR&Jc"tX/y*B objServerList[listLength+1][symbol(EventName)].append(regSpr)
"?1^(I;y9Y _ end if
%Q$K;\F.Sn
7Q l#mS&bo@ end
D2J'd!B4_"\K on removeListenerObj me,EventName,RegSpr --撤销精灵的注册事件奥古多媒体7n2]iMo%Rl?
tchange=0
r/uP?[D;GQ repeat with i=1 to objServerList.count奥古多媒体;k-[*ha6EQg
if ObjServerList[i].getPropat(1)=symbol(EventName) then --事件列表中有这个精灵
4c5b)Iq6z7@"_"n objServerList[i][symbol(EventName)].deleteOne(regSpr) 奥古多媒体R3ab I+["V&`$v
if objServerList[i][symbol(EventName)].count=0 then
^6e+Tya@r,L objServerList.deleteAt(i)奥古多媒体Z#G+_F v
end if奥古多媒体2?"nA RV%J(W [
tchange=1奥古多媒体G;gN3WxhQt
end if
? V dF4u W 奥古多媒体0RN'`;^-|}
end repeat
0Gj(JN!r i)BR3v if tchange=0 then
9o qH wc ~"K;]0m put "The Event isn't exist!"
;v#D"X7D'R end if
O8S,g)u"]
Ck^2FD'P[p end奥古多媒体 Z+U_Q%i
on BroadMsg me,EventName,EventSource --主题发出广播奥古多媒体)E'v T.p8[;B
repeat with i=1 to objServerList.count奥古多媒体.i;Ky;o}
if ObjServerList[i].getPropat(1)=symbol(EventName) then奥古多媒体hJM B Wh6FeQ
repeat with j=1 to objServerList[i][symbol(EventName)].count奥古多媒体"C Er9B&\,X
call (symbol(EventName),objServerList[i][symbol(EventName)][j],EventName,EventSource)奥古多媒体 _H'X [By
end repeat
-u7bKA3U m,c put "send Msg success!"奥古多媒体o9e!Q2v5IvLN
return
"soT,j q end if奥古多媒体&{Chw C$x
end repeat奥古多媒体,~:^JTK3GPx
put "No Event"奥古多媒体}P2r1T(hL
end奥古多媒体 o(pt{{N4j+T$L}.S7w
--------------------------------------------------------------------------------------------------------奥古多媒体'h4}8s^y~YU CR
在影片开始处添加以下程序初始化EventObj对象
w c4cU0V:p -----------------------------------------------------------------------------------------------------------奥古多媒体2t,?AM Z Y
global geventObj奥古多媒体J2V.~L4o#pGB W
on preparemovie --生成一个事件控制对象
xz8{|,nN gEventObj=script("eventObj").new()
d G!dT(Ay,O? end
'X@!Zx%e;Z-U --------------------------------------------------------------------------------------------------------------
jl9Q6P5kol4C t 在电影的附加以下行为,主要是注册接受五个事件和发出一个事件及定义事件处理程序奥古多媒体r"_OH+^-Q _&D5|s ^
--------------------------------------------------------------------------------------------------------奥古多媒体H E0G6^Rd }
global gEventObj
'^CE%W xK$~oxpZ property pDuration,vValue
_D7^ mX6]b ? on beginsprite me奥古多媒体%O8a#xuZd q#?-{
pDuration=sprite(me.spritenum).duration奥古多媒体|5ta[ Y/x3l
--侦听以下的事件奥古多媒体'Kv!r&wZ-p*Y_
gEventObj.addListenerObj("play",me)奥古多媒体Yn3Prz3H u?b
gEventObj.addListenerObj("stop",me)奥古多媒体GaT-Q D/vi!R
gEventObj.addListenerObj("backward",me)
s5Qq`bqk{O^ gEventObj.addListenerObj("forward",me)奥古多媒体B!V2Q'ni7H
gEventObj.addListenerObj("rewind",me)奥古多媒体/` O4h4O b x/o
gEventObj.AddListenerObj("dragbar",me)
~9UENP9m$[ end奥古多媒体?Y*dU.qxZ
on prepareFrame me奥古多媒体 a:vH5[ QXH
vValue = float (sprite(me.spritenum).movietime) / pDuration奥古多媒体E i4N5y0a |3x q
gEventObj.broadMsg("NowMovieTime",me) --广播事件奥古多媒体f$l'D:_A)TA)[:S"u]
end
9D@p7V"X7FH/tN --侦听到的事件由下面函数处理奥古多媒体|P%|'r B
on dragbar me,EventName,Eventsource
x$l wk9aOo7| -- pSpriteNum, pPosition
f"^!j}D1GR sprite(me.spritenum).movieTime = integer (pDuration * Eventsource.pPosition)
\r C:@#V;G:Dm)l C end
4QxR-S,HtF#B V 奥古多媒体8G*O&v XR
on play me奥古多媒体7U){5OG!KW3n%s
put "play"奥古多媒体M8\;Z+k hV8n.].a6k
sprite (me.spritenum).movieRate = 1
*W"a$`8]u_:K end奥古多媒体QG,Fh"TW`

1H%` H;Yp` V0OD i on stop me奥古多媒体D_!j1`g'S k
put "stop"
[7u"g*[5e%c x.}&]z sprite (me.spritenum).movieRate = 0
Z/xWM;r%x end
w@ L.}6Qa|.L{F 奥古多媒体%i%v AGH R
on backward me,EventName,Eventsource奥古多媒体qL `Fs2iZ
put "backward"奥古多媒体:yakp B
if the mouseDown and rollover (Eventsource.spriteNum) then奥古多媒体] B ^"RK

(loal6{M!t|2[.D sprite (me.spritenum).movieRate = -2
^[ h oH else 奥古多媒体LqH{uX"R&S
sprite (me.spritenum).movieRate = 0奥古多媒体-?S8f!lh6l
奥古多媒体N F[ XP%^z;K
end if奥古多媒体O }A6tJs
end奥古多媒体$\"ar2V o4p,Y1L/n0S'X
奥古多媒体7e hJ2RIA [

p7g-p:~Qjs'd0Zu/}8@ on forward me,EventName,Eventsource奥古多媒体ynoaNv_(qv+]@
put "forward"奥古多媒体KiaH$B(q?d{
if the mouseDown and rollover (Eventsource.spriteNum) then奥古多媒体7Z.] uSR
put "MovieRage=2"奥古多媒体 __*Bdh/gIc
sprite (me.spritenum).movieRate = 2
$_q+B5yBdP,x+sY CC else
oq+t_`5V8x W sprite (me.spritenum).movieRate = 0奥古多媒体JSI/P,F!} ]`,Y
put "MovieRage=0"奥古多媒体WE-~0X"H-Y
end if奥古多媒体 VUke%dG tw;F
end奥古多媒体 p ?;o OD!Z5DI6H
on rewind me
I+l)F's`1Zi ^~ put "rewind"奥古多媒体1}q(ri,Qb
sprite (me.spritenum).movieRate = 0奥古多媒体J7{R M"Gu%s
sprite (me.spritenum).movieTime = 0奥古多媒体'UjLYe_

(y#`%a$[!O;TeLV ` end
9|k J.L u#P#W%v/O!n --------------------------------------------------------------------------------------奥古多媒体 kd"|Wqc9~,J7f
在各个按钮上面则附加下面的行为:
5\:OZL4[ [*\ --------------------------------------------------------奥古多媒体7x"z'KKvYCJ,id O
global gEventObj
`B'ue(We property EventName奥古多媒体1VX7[&f-PM
奥古多媒体/@k,U N)t!G$Xl
on mousedown me
Rdf*Q;CJPa%D gEventObj.BroadMsg(EventName,me) --广播事件
6^ [epQDdX end
1Cs7h^5`ZL w*] on mouseup me
p,{(o5N#wY"f6rmk if EventName="backward" or EventName="forward" then奥古多媒体 \6P Mm,ecT2q3V
gEventObj.BroadMsg(EventName,me) --广播事件奥古多媒体z{)z"d.yq
end if奥古多媒体!y Ey8Id
end奥古多媒体Zt`+M!i[Z

Z1^0MY`j]` on getpropertydescriptionlist me奥古多媒体 tx | sx%N4xO9f
plist=[:]
^q*PD9V#HW } setaprop plist,#EventName,[#comment:"请输入事情名",#format:#string,#range:["play","stop","backward","forward","rewind"],default:"play"]奥古多媒体&BD'F1Bj B'R sjMB
return plist奥古多媒体,I1N!N@H }
end奥古多媒体"^/n!_A3^pE
---------------------------------------------------------------
7Oc1C z0i;b 这样一个基本的电影控制就完成了。奥古多媒体lNF#I)Vr1u@A$yY
奥古多媒体7X h]/W B,Oz
如果用户需求改变需要用一个文本演员显示电影播放的进度,则只需要建立一个文本演员,然后侦听相应的事件即可,行为如下:奥古多媒体 G0`}&@$u0c T
----------------------------------------------------------
]8@p(D o"H5O{6hp k8V"E global gEventObj
!L!RA[3R on beginsprite me奥古多媒体 Dt3ULH6W1}|,C
gEventObj.addlistenerObj("NowMovieTime",me) --侦听nowMovieTime事件
W([7u;XbGL end奥古多媒体U*\u U*J8Q9r
on NowMovieTime me,EventName,EventSource
#P%O4W-jG8~[U sprite(me.spritenum).member.text=string(EventSource.vValue)奥古多媒体~/Qxv ft
end奥古多媒体5t+A)Ef WMVI
------------------------------------------------------------------奥古多媒体x u2X,`.[9G w1_
奥古多媒体e6{dI| }
关于播放条,我修改了部分程序,既增加了三个地方:
,N(O,]5jt{E#O%}{ 在beginsprite的时候奥古多媒体"Kc6Zbz:ak
gEventObj.addlistenerObj("NowMovieTime",me)奥古多媒体3sX%c6X ZVq
然后定义了一个nowMOvieTime的函数用来处理相应的事件。奥古多媒体RPyM@VOV

L@gV iCP4Pr
H0e5T(l:{ 这只是一个最基本的例子,在实践中,我们往往需要扩展这个程序。希望本文可以给广大Director爱好者一些启迪。
0{(P%i%e1Y_&Zp 最后感谢我在高山的大哥老张,和他的探讨给了我很多的思路。奥古多媒体B6GRE/v{
奥古多媒体&Q.i|Cf(Oy_
源文件下载: http://www.aougu.net/bbs/index.php?...::dl&pid=176494

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


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