首页 > 网站 > 媒体动画 > 正文

Director基础教程:Shockwave 预载技术(3)

2024-09-08 19:27:09
字体:
来源:转载
供稿:网友
shockwave 预载技术
   原著:lingoworkshop
   翻译:alphachi

第二部分:进度条组件

   在上一部分,我们创建了一个“preloader”父代剧本用来:(1)预载一个url;(2)当预载完成时发送一个消息;(3)预载进行时发送“状况”消息。在这一部分,我们将创建一个可以显示当前状况(例如预载完成的百分比)的进度条。

   创建进度条有很多种方法。我们可以使用flash角色、可拉伸的图形角色、普通的文本角色以及像os controls这样的xtras提供的相关组件等,不过在这里,我们选择了imaging lingo。无论使用何种方法,剧本自身都应该能够对下列消息做出响应:(a)等待连接到服务器时发送的mshowworking消息;(b)知道预载已经完成多少时发送的mshowprogress消息(是一个数值)。

   当我们将mshowworking消息发送给下面的剧本时,一个简单的动画将被绘制到舞台上。当我们发送mshowprogress消息时,这个动画将被一个简单的进度条替换。

simple progress bar (v.1)

-- 声明属性变量
property mycolour, mycolour2
property mycanvas, myscreenrect, mybuffer, mybufferrect
property mystep, mysegmentsize

on beginsprite me
   thissprite = sprite ( me . spritenum )
-- 确定绘制范围
   myscreenrect = thissprite. rect
-- 对输出图像进行引用
   mycanvas = ( the stage ). image
-- 创建图像缓冲
   mybuffer = image (myscreenrect. width , myscreenrect. height , 24 )
   mybuffer. copypixels (mycanvas, mybuffer. rect , myscreenrect)
-- 存储rect以便稍后使用
   mybufferrect = mybuffer. rect
-- 建立动画运行参数
   mystep = 0
   mysegmentsize = mybuffer. height - 4
-- 控制其他的角色
sendallsprites ( # mregisterwidget, me , # progressbar)
end

on mshowprogress ( me , amt)
-- 确保amt在0和1.0之间
   amt = min ( 1 . 0 , max ( 0 , amt))
-- 复制缓冲
   buffer = mybuffer. duplicate ()
-- 绘制边界
   buffer. draw (mybufferrect, [ # shapetype: #rect , # color: mycolour])
-- 计算基于显示数量的填充rect
   progressbarrect = rect ( 2 , 2 , (mybufferrect. width - 2 )*amt, mybufferrect. height - 2 )
-- 填充进度条rect
   buffer. fill (progressbarrect, mycolour)
-- 将运行结果复制到舞台上
   mycanvas. copypixels (buffer, myscreenrect, mybufferrect)
end

on mshowworking ( me )
-- 复制缓冲
   buffer = mybuffer. duplicate ()
-- 绘制边界
   buffer. draw (mybufferrect, [ # shapetype: #rect , # color: mycolour])
-- 给属性变量mystep加1,以便单独移动stripes
   mystep = mystep + 1
-- 如果绘制部分过大则进行重设
if mystep > 0 then mystep = -mysegmentsize
-- 创建临时图像
   innerrect = buffer. rect . inflate (- 2 ,- 2 )
   innerimage = image (innerrect. width , innerrect. height , 24 )
   innerimage. fill (innerimage. rect , mycolour)
-- 绘制stripes
   l = mystep
repeat while true
     drect = rect (l, 0 , l + mysegmentsize, mysegmentsize+ 2 )
     innerimage. draw ( point (l, 0 ), point ( l + mysegmentsize, mysegmentsize), [ # shapetype: #line , # linesize: 1 , # color: mycolour2, # ink: 2 ])
     l = l + mysegmentsize
if l > buffer. width then exit repeat
end repeat
-- 向缓冲中添加内容
   buffer. copypixels (innerimage, innerrect, innerimage. rect )
-- 将运行结果复制到舞台上
   mycanvas. copypixels (buffer, myscreenrect, mybufferrect)
end

on getpropertydescriptionlist ( me )
   pdlist = [:]
   pdlist[ # mycolour] = [ # comment: "bar colour" , # format: #color , # default: rgb ( 68 , 68 , 68 )]
   pdlist[ # mycolour2] = [ # comment: "stripe colour " , # format: #color , # default: rgb ( 255 , 255 , 255 )]
return pdlist
end

   这个简单的进度条行为本身唯一的作用只是对mshowworking和mshowprogress消息做出响应,而当beginsprite事件发生时,它又会发出一个mregisterwidget消息,这样做的目的是让别的对象能够获得对其的引用(作为参数和mregisterwidget消息同时被发送的“me”引用)。这些对象需要此引用以便进行反馈工作,当然,也可以使用sendsprite和sendallsprite命令实现这一点。

[1] [2] 下一页  

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表