#22000/11/18 17:47:03
谢谢东影默的分享。 我想这是一个好的例子来学习behavior, 和oop的概念。
lingo中一个效果可以有多种方法实现, 最好的code应该是简洁,易懂, 易扩展,可重复使用的。 behavior就是一个范例。
director 说穿了, 是控制sprite的艺术, score 窗口的power 是我们大家都了解的。 而lingo 可以完全替代score窗口来完成对sprites 的控制。sprite behavior在lingo script的优先次序中名列首席, 我们就从这里开始。
button的效果最基本的就两种, 常态, 和鼠标划过时, 为了把问题简化,我们就看这两种状态。
基本思想是鼠标划过时, 舞台上的button sprite动态的替换为表现为rollover 的那个cast member, 而当鼠标离开这个sprite时, 该sprite 回复为表现为常态的那个member.
用lingo 来翻译就成了:
on mouseEnter
sprite("button").member=member "rollover"
end
on mouseLeave
sprite("buton").member= member"常态"
end
为了让这个表达更具有普适性, 我们可以用两个变量来分别代表常态的button member和rollover的button member, 就用normal 和rollover来作为变量名字吧, (最好在它们前面加上一个"p", 代表是 property variable). 好, 改写一下, 先宣布一下属性变量,
property pNormal
property pRollover
on mouseEnter
sprite("button").member=pRollover
end
on mouseLeave
sprite("buton").member= pNormal
end
问题是sprite 没有名字只有channel 的number, 我们不能用sprite("button")来表示, 解决的方法其实出乎你意料的简单, 我们知道sprite script需要附在某个sprite 上来接受message, 而script 本身也是一个object 存储在RAM中, 我们可以利用一个简单的参数“me”来传递这个重要的信息, me 就代表附在当前那个sprite上的script , me 也有一个属性- spriteNum, 告诉我们当前的sprite 所在的channel number. Cool, 再改写一下,
property pNormal
property pRollover
on mouseEnter me
sprite(me.spriteNum).member=pRollover
end
on mouseLeave me
sprite(me.spriteNum).member= pNormal
end
好看多了, 进一步分析, 其实pNormal 就是舞台上已开始显现的那个button sprite 的member. 这是很明显的, beginSprite 这个handler 就是最好的位置来进行初始化的设定。
property pNormal
property pRollover
on beginSprite me
pNormal = sprite(me.spriteNum).member
end
on mouseEnter me
sprite(me.spriteNum).member=pRollover
end
on mouseLeave me
sprite(me.spriteNum).member= pNormal
end
到了这一步,可以说除了pRollover还是未知以外,其它的问题都解决了, 耐心读下去,
对于pRollover来说,我们可以用规则有序排列cast members的办法, 每个常态button member 后面都跟着它的rollover 的button member, 如果是这样的话,
pRollover = member(pNormal.number + 1)
不是很理想, 谁愿意这样小心翼翼的布置cast members 呢? 一个不小心搞错了位置就前功尽弃了。
不从member number 上动脑筋就从member name 上下手, 如果每个rollover button member的名字都使用其常态member的名字加上一个后缀, 例如“ rl ”, 那么
pRollover = member(pNormal.name&"rl")
这么做的好处是显而易见的, 你不需要为members 在cast 中的特定位置操心, 只需要按照一个命名原则就行了。 那有没有连命名也无须挂虑的方法呢? 答案是:Yes.
behavior 里有一个handler 是专门处理生成一个对话框来允许你赋值给参数的。 你也许用过behavior library里的行为, 每次drag 它到sprite 上时, 多半会弹出一个对话框, 如果我们也能用这个方式, 允许用户(我们自己)在使用这个行为时也弹出对话框, 让我们填入所需的信息,那是最理想不过的了。 事实上, 实现起来很简单,
on getPropertyDescriptionList me
return [#pRollover: [#comment: "which member is the rollover member?",\
#format: #member,\
#default: void]]
end
已经写的够长的了, 不细解释了, 记住return 是负责弹出对话框的命令, 而对话框是由一个property list 来定义的, property list 的写法是: [:] 冒号两边分别是property 和它的值。
"\" 是行连接符, 表示这一行还没结束。
好,最后这个button 的behavior 如下:
property pNormal
property pRollover
on beginSprite me
pNormal = sprite(me.spriteNum).member
end
on mouseEnter me
sprite(me.spriteNum).member=pRollover
end
on mouseLeave me
sprite(me.spriteNum).member= pNormal
end
on getPropertyDescriptionList me
return [#pRollover: [#comment: "which member is the rollover member?",\
#format: #member,\
#default: void]]
end
你可以根据你的需要来扩展, 例如down button, button 按下后的动作, 是否要有音效, 等等。
希望我表达的你能明白。 最后谢谢你一直读完它。:):)
编辑历史:[这消息被flyingbird编辑过(编辑时间2000-11-18 17:47:54)]
[这消息被flyingbird编辑过(编辑时间2000-11-19 15:54:06)]