绘制 API 示例:算法可视化生成器Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 Algorithmic Visual Generator 示例在舞台上动态绘制几个“卫星”,即在圆形轨道中运动的圆形物。要阐述的功能包括:
上一小节中的示例使用 Event.ENTER_FRAME 事件对唯一的“卫星”进行动画处理。该示例在此基础之上进一步扩展,生成一个包含一系列滑块的控制面板,这些滑块会立即更新若干卫星的可视显示内容。此示例将代码格式设置为外部类,并将卫星创建代码包装在循环中,以将对每个卫星的引用存储在 satellites 数组中。 若要获取此示例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn。可以在 Samples/AlgorithmicVisualGenerator 文件夹中找到应用程序文件。此文件夹包含以下文件:
设置侦听器应用程序先创建三个侦听器。第一个侦听器侦听从控制面板中调度的事件:必须对卫星进行重新构建。第二个侦听器侦听对 SWF 文件的舞台大小的更改。第三个侦听器侦听 SWF 文件中每个经过的帧,并使用 doEveryFrame() 函数进行重绘。 创建卫星在设置这些侦听器后,将调用 build() 函数。此函数先调用 clear() 函数,后者清空 satellites 数组,并清除以前在舞台上绘制的任何内容。这是必要的,因为每当控制面板发送事件来执行此操作时,都可能会重新调用 build() 函数,例如在颜色设置已发生变化时。在这种情况下,必须删除并重新创建卫星。 该函数随后创建一些卫星,并设置创建所需的初始属性,如 position 变量(从轨道中的随机位置开始)和 color 变量(在本示例中,该变量在创建卫星后不会发生改变)。 创建每个卫星时,会将对它的引用添加到 satellites 数组中。调用 doEveryFrame() 函数时,它将更新此数组中的所有卫星。 更新卫星位置doEveryFrame() 函数是应用程序动画过程的核心。将为每个帧调用该函数,频率等于 SWF 文件的帧频。由于绘制变量略微发生了变化,因此,这会利用原有的动画外观。 该函数先清除以前绘制的所有内容,然后再重绘背景。接下来,它循环访问每个卫星容器,增加每个卫星的 position 属性以及更新 radius 和 orbitRadius 属性(这些属性可能由于用户与控制面板的交互而发生了变化)。最后,通过调用 Satellite 类的 draw() 方法,在新位置对卫星进行更新。 请注意,计数器 i 最多只增加到 visibleSatellites 变量。这是因为,如果用户通过控制面板限制了显示的卫星数,则不会重绘循环中的其余卫星,而应将其隐藏起来。这种情况发生在紧靠负责绘制的循环后面的循环中。 当 doEveryFrame() 函数完成时,将在屏幕上的位置中更新 visibleSatellites 数量。 响应用户交互用户交互是通过控制面板发生的,它是由 ControlPanel 类管理的。此类设置一个侦听器,并为每个滑块设置单独的最小、最大和默认值。当用户移动这些滑块时,将调用 changeSetting() 函数。此函数更新控制面板的属性。如果更改需要重新构建显示内容,则会调度一个事件,随后将在主应用程序文件中对该事件进行处理。当控制面板设置发生变化时,doEveryFrame() 函数将使用更新的变量绘制每个卫星。 进一步自定义本示例只是概要介绍了使用绘图 API 生成可视内容方面的基础知识。它使用相对较少的几行代码来创建似乎非常复杂的交互式体验。尽管如此,您还是可以对本示例进行较小的改动以进行扩展。下面列出了一些很好的方法:
可以将绘图 API 作为在 Flash 创作环境中创建视觉效果的替代方法,以便在运行时绘制基本形状。但是,它也可以用来创建涵盖范围很广且无法手动创建的各种视觉效果。通过使用绘图 API 和一些数学函数,ActionScript 作者可能实现很多意想不到的创作效果。 |
|