有一个朋友在论坛上问如何让一个text sPRite 自动滚屏? 还有一个要求是,当滚动到文本的最后一行,可以再回到第一行重新继续滚动, 另外还要求如果鼠标点在文本上就停止滚动,再点击又继续滚动。
回答:
这是一个很有趣的问题, lingo 的语句并不难, 需要了解的是一些背景知识和解决问题的过程, 事实上, lingo programming的过程就是解决问题的过程, 对于解决问题来说, 第一步莫过于定义问题是什么?从上面的问题里我们已经了解得比较清楚了, 下面是问题清单:
1.Text sprite 自动滚屏;
2.当滚动到最后一行时回到第一行重新开始滚动;
3.鼠标点击toggle 滚屏的on 和off.
我们知道, text member可以有几种不同的framing 设定,对于滚屏来说,最合适的设定是fixed.见下图:
这样可以将比较长的文件限制在有限的舞台空间来显示,同时又不出现滚动条。 不过这只完成了第一步, 我们需要lingo 把文本文件滚动起来。 最合适的的语句是用scrollTop这个text member 的属性。 它的定义是从member 的顶端到第一行可见文字的距离, 当movie 播放时,我们都会使用on exitFrame 句柄来制造循环。 好, 如果我们可以让这个text sprite 在每次离开frame时,它的member.scrollTop值就增加一点,不就实现了滚动了吗。
member.scrollTop=member.scrollTop + 4
这就是核心语句。 那么如何得知文本最后一行的位置以及建立与scrollTop的关系呢? 请看下图:
我们可以很容易的得出这样的结论, 当最后一行文本显示在舞台上时,那时候text member 的scrollTop 值等于member的高度减去sprite 的高度。也就是 :
member.height – sprite.height = the scrollTop when last line appear on the stage.
鼠标的控制比较容易,设定一个flag就可以了。
问题分析完了,开始写script, 最好是写成behavior的形式, 符合OOP的概念, 又可以使用在不同的text sprite 上。 你可以持续丰富你自己的behavior library.
property pText --文本member
property pspeed --滚动速率
property pFlag --判断条件
property pLastLine --scrollTop的极限值
property pCurrentTop --当前的scrollTop值
--初始化
on beginSprite me
sprite(me.spriteNum).member.scrolltop=0
pText=sprite(me.spriteNum).member
pLastLine=pText.height - sprite(me.spriteNum).height
end
--循环中监测符合滚动的条件并发出滚动的指令
on exitframe me
if pFlag=1 then
pCurrentTop=pText.scrollTop
if pCurrentTop < pLastLine then
scrollText me
else
pCurrentTop=0
scrollText me
end if
end if
end
--核心语句使text滚动
on scrollText me
pText.scrolltop=pCurrentTop + pSpeed
updatestage
end
--toggle flag on and off
on mouseDown me
pFlag=not pFlag
end
on getPropertyDescriptionList me
return [#pSpeed:[#comment:\"滚动速度: \",#format:#integer,#default:\"2\"],\\
#pFlag:[#comment:\"自动开始滚动?\",#format:#boolean,#default:\"1\"]]
end
下图是当用该行为对text sprite赋值时的screen shot: