PHP生成Flash动画的实现代码


Posted in PHP onMarch 12, 2010

其中有一组映射到 SWF 动画中的数据类型的对象:子图形、图形、文本、位图等等。在本文中,我使用了预编译的扩展 php_ming.dll 库用于 Windows 版本的 PHP。

清单 2 显示了使用 Ming 库实现的 HelloWorld 示例。


清单 2. Hello.php
setFont( $f );$t->setColor( 0, 0, 0 );$t->setHeight( 400 );$t->addString( 'Hello World' );$m = new SWFMovie();$m->setDimension( 2500, 800 );$m->add( $t );$m->save( 'hello.swf' );?>

在命令行中运行这段代码将生成文件 hello.swf。当我在 Web 浏览器中打开该文件时,看到了图 1 所示的结果。


图 1. 使用 Ming 的 HelloWorld 示例
PHP生成Flash动画的实现代码

回过头来查看这段代码,我做的第一件事是创建指向一个内置字体(_sans)的指针,然后创建文本字段,设定字体、颜色和大小,最后为其提供 一些文本内容(“Hello World”)。再接下来创建了一个 SWFMovie 对象并设定其尺寸。最后,向动画中添加了文本元素并将动画保存到文件中。

作为直接构建文件的替代性方法,也可以使用下面的代码,使 SWF 动画像页面那样输出,而无需使用 save 方法:

header( 'Content-type: application/x-shockwave-flash' );$m->output( );

此过程类似于使用 PHP 中的 ImageMagick 库来构建位图。对于所有 Ming 示例,我都将使用 save 方法,但您可以根据喜好来选择是否使用 save 方法。

让文本动起来

只是将一些文本放入 Flash 动画中是没有多大意义的,除非您能让它动起来。因此我整合了清单 2 中的示例,它包括两段文本:一部分开始很小后来变得越来越大,而另一部分保持静态。


清单 3. Text.php
setFont( $f );$pt->setColor( 0, 0, 0 );$pt->setHeight( 400 );$pt->addString( '1000' );$tt = new SWFTextField();$tt->setFont( $f );$tt->setColor( 192, 192, 192, 90 );$tt->setHeight( 350 );$tt->addString( 'Points' );$m = new SWFMovie();$m->setDimension( 2500, 800 );$pts = $m->add( $pt );$pts->moveTo( 0, 0 );$tts = $m->add( $tt );$tts->moveTo( 1300, 200 );for( $i = 0; $i nextframe(); $pts->scaleTo( 1.0 + ( $i / 10.0 ), 1.0 + ( $i / 10.0 ) );}$m->save( 'text.swf' );?>

在命令行中执行这段代码时,它将生成 text.swf。在 Web 浏览器中打开该文件时,我看到了图 2 所示的图片。


图 2. text.swf 文件
PHP生成Flash动画的实现代码

文本 “1000” 开始时很小,大小为 350 个点。然后使用 scaleTo() 方法使其增大为 750 个点,方法是对动画对象使用 nextframe() 方法。

要理解其工作原理,需要了解一点 Flash 制作动画的方法。Flash 中的动画就像电影中的动画一样运行:按帧运行。子图形将按帧在动画框架中移动。一个主要差别是 Flash 不获取每帧的快照。它存储子图形对象在每帧的状态。

您可能会注意到,我有一个名为 $pt 的变量,该变量具有文本 “1000”。随后当我把 $pt 添加到动画中时,获得了通过 add() 方法返回的名为 $pts 的新对象。该对象是 SWFDisplayItem, 表示子图形的实例。然后我可以围绕动画框架的表面逐帧移动实例。 这有点儿混乱,但我可以拥有同时移动的多个版本的 “1000” 文本子图形或 “points” 文本子图形。

绘制一些图形

接下来要处理的是矢量图形。首先仅绘制一条简单的直线,它从框架的左侧顶部到右侧底部。


清单 4. Line.php
setDimension( 300, 300 );$s = new SWFShape();$s->setLine( 10, 0, 0, 0 );$s->movePenTo( 10, 10 );$s->drawLineTo( 290, 290 );$m->add( $s );$m->save( 'line.swf' );?>

在命令行中运行此脚本,然后查看输出的 .swf 文件,效果如图 3 所示。


图 3. 绘制简单的直线
PHP生成Flash动画的实现代码

好的 —— 这十分简单,也不怎么令人激动。那么我做了什么?创建了一个新的 SWFShape 对象,然后向其中添加了一些笔触移动和直线。然后我将其作为子图形添加到了动画中。

为了让它变得更有趣,我使用了与刚才文本中使用的相同的帧式动画。但在本例中,我用下面所示的代码使这条直线围绕动画的中心旋转。


清单 5. 旋转直线
setDimension( 300, 300 );$s = new SWFShape();$s->setLine( 5, 0, 0, 0 );$s->movePenTo( -100, -100 );$s->drawLineTo( 100, 100 );$ts = $m->add( $s );$ts->moveTo( 150, 150 );for( $i = 0; $i rotate( 10 ); $m->nextframe();}$m->save( 'rotate.swf' );?>

在本例中,我从 -100, -100 到 100, 100 画了一条直线。这将把直线的中心放在坐标 0,0 处。这样,当我在旋转图形时,直线的中心将发生旋转。

当我向动画中添加图形时,将移动返回到框架中心的 SWFDisplayItem。然后用 rotate() 方法使它旋转并每旋转一周就增大其框架。

使用图片

文本和诸如直线、圆、弧、曲线和矩形之类的简单矢量图形都是十分优秀的,但在理想的情况下,您必须能访问这些 Flash 动画中的图片。值得庆幸的是,Ming 库使您可以轻松的使用图片,如下所示。


清单 6. 使用图片
addFill( $img );$s->setRightFill( $imgf );$s->movePenTo( 0, 0 );$s->drawLineTo( $img->getWidth(), 0 );$s->drawLineTo( $img->getWidth(), $img->getHeight() );$s->drawLineTo( 0, $img->getHeight() );$s->drawLineTo( 0, 0 );$m = new SWFMovie();$m->setDimension( $img->getWidth() * 2, $img->getHeight() * 2 );$is = $m->add( $s );$is->moveTo( $img->getWidth() / 2, $img->getHeight() / 2 );for( $i = 0; $i skewx( 0.02 );$is->skewy( -0.03 );$m->nextframe();}$m->save( 'image.swf' );?>

在命令行中运行此脚本并在浏览器中查看 image.swf,结果如图 4 所示。


图 4. 生成的图片动画
PHP生成Flash动画的实现代码

此脚本在开始时读取了本地的 .jpeg 文件(在本例中,是我女儿 Megan 的照片)。然后创建一个矩形,并在其中填充图片。在那之后,它在10 帧处使用了位移效果使图片稍微移动。

继续移动

我只是触及了 Ming 库可为您提供的操作的表面。在这里我没有展示交互部分,在交互部分您可以将简单的脚本与元素连接起来。(但是,如果换成是交互操作,如果您有一个十分复杂 的 Flash 动画,则可能需要考虑使用 Flash 开发工具来构建 Web 应用程序内与 Web 服务对话的 Flash 动画。)

构建更加复杂的 Flash 动画的另外一种选择是使用诸如 Adobe Flex 或 Laszlo 之类的制作工具,这两种工具都提供了用于为 Flash 动画的用户界面布局的 XML 语法以及一个更轻松地例程,可用于开发为界面提供互动操作的 JavaScript。

PHP 相关文章推荐
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
php防攻击代码升级版
Dec 29 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
PHP http请求超时问题解决方案
Nov 13 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 PHP
PHP使用QR Code生成二维码实例
Jul 07 PHP
PHP 引用是个坏习惯
Mar 12 #PHP
PHP 页面编码声明方法详解(header或meta)
Mar 12 #PHP
用PHP获取Google AJAX Search API 数据的代码
Mar 12 #PHP
PHP开启gzip页面压缩实例代码
Mar 11 #PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 #PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 #PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 #PHP
You might like
php横向重复区域显示二法
2008/09/25 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
pandas 空数据处理方法详解
2019/11/02 Python
python中rc1什么意思
2020/06/19 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
环保建议书作文
2014/03/12 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
库房管理员岗位职责
2015/02/12 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技
python turtle绘图
2022/05/04 Python
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL