zoukankan      html  css  js  c++  java
  • [轉]用ASP 或者Delphi生成 Flash 动画

    轉自:http://www.cnblogs.com/smallmuda/archive/2009/06/17/1505416.html

    ASP 或者Delphi生成 Flash 动画

    孙以义

     

    一、概述

     

    Flash Macromedia 公司工具出品的著名网页动画和多媒体工具,这个矢量格式网页工具自推出以来,受到广泛的欢迎和应用,截止20006月的统计,Flash的用户达到2亿48百万,即大约91.8%Web用户能够观看Flash动画[1]

    Flash动画是以SWF文件格式存放的,Macromedia 公司于19984月公布了SWF文件的格式,可参见http://www.openswf.org,并推出了Macromedia Flash FileFormat (SWF) SDK (本文以下简称SWF SDK),用于开发者研制开发Flash动画即SWF文件的生成工具。SWF SDK中包含了SWF文件格式的说明文档、用Microsoft Visual C++开发的C++(classes)以及一些范例[2]

    其中的C++类分为两个层次:低层类(low level classes)和高级类(high level classes)。低层类是对SWF文件元素的直接影射和封装,高级类是进一步的抽象,从而更加容易使用,例如高级类中可以用圆心坐标和半径定义一个圆形,而低层类中需要用曲线形状记录(curved shape records)来构造圆形。读者可以下载SWF SDK阅读其中的文档以了解更多的细节。

           本文笔者应用Microsoft Visual C++中的ATL,将SWF SDK中的高级类封装成了COM Objects,以便使得使用更多的编程语言,例如Borland Delphi ASPVisual Basic等所有支持COM Automation的语言都能够生成Flash动画。这些COM Objects 被命名为Bukoo Flash Objects。本文不是描述Bukoo Flash Objects的开发方法和过程,而是介绍如何使用它。如果结合ASPBukoo Flash Objects,就能在网页中动态生成Flash动画,而不需要Flash软件。

    二、下载安装

           Bukoo Flash Objects可以在以下网址下载:

    http://www.delphibbs.com/bukoo或者http://www.geocities.com/yiyisun/bukoo

           下载的文件为 swfobjs.zip,解压后除了文档和范例,Bukoo Flash Objects就在swfobjs.dll中,请使用 regsvr32 swfobjs.dll安装Bukoo Flash Objects,使用regsvr32 /u swfobjs.dll卸除Bukoo Flash Objects

           三、基本对象及其属性

    Bukoo Flash Objects总共包括三个COM ObjectsswfMovieswfObjectswfAction

    通过创建这三个对象生成Flash动画的过程是:创建swfMovie动画对象,设置动画属性,例如画面尺寸、每秒帧数,在各个帧中创建、插入和删除swfObject元素对象和swfAction动作对象,最后输出Flash动画。

           下面是这三个对象应用方法介绍。

    1、swfMovie 动画对象

    swfMovie对象代表即将生成的Flash动画,首先需要设置的是动画的大小,swfMovie对象的SetSize方法用于设置动画的尺寸。要注意SWF中坐标单位是twip,即1/1440英寸,或者说是1/20像素,例如动画尺寸为400 x 300像素,即为 8000 x 6000 twip。必须这样调用:SetSize(8000, 6000)

    动画可以都多个帧(frame),动画播放的速度为每秒帧速。SetFrameRate(12),就是动画每秒放12帧,每秒帧速高,动画平滑,但是SWF会变大,影响下载速度,故需要权衡利弊。动画都多少帧不必设置,只管用GotoFrame方法定位到指定帧,然后插入元素或者动作,swfMovie对象自动增加帧数到调用GotoFrame方法的最大数目。

    插入和删除元素的方法是 AddObjectRemoveObject,插入动作的方法是AddAction。有哪些元素和动作将在下两节中介绍。这里暂且先看如何输出SWF文件。

           WriteMovie方法就是按照指定的文件名生成SWF文件。

           或者,swfMovieContent属性是VARIANT类型,可以用ASP中的response.binarywite输出到网页中。详见下面的范例。

          

    2、swfObject 元素对象

    swfObject象是一个千面人,创建这个对象以后,可以用其MakePolygon方法使其变成多边形、用MakeRectangle方法变成矩形、用MakeOval方法变成椭圆形、用MakeCircle方法变成圆形、用MakePitcure方法变成Jpeg图象、用MakeButton方法变成按钮、用MakeSound方法变成声音、用MakeFont方法变成字体、用MakeText方法变成文字等等。

    SWF中的文字处理比较特殊,需要先将TrueType字体转换成字体对象,再用字体对象生成文字[3]。详见下面的范例。

           swfObjectTranslate方法用于平移元素,坐标定位twipRotate方法用于旋转元素;Scale用于缩放元素。注意旋转和缩放方法的参数单位也比较特殊,称为Fixed,简单的换算方法是乘以65536,例如旋转10度,需要用10*65536,放大2杯,需要用2*65536,依次类推。

    swfObjectSetLineWidth方法用于设置对象边框线的宽度,单位twipSetLineColorA方法用于设置对象边框线的颜色,它有四各参数,分别代表红、绿、蓝和AlphaAlpha参数规定颜色的透明程度。alpha=255不透明,完全覆盖下面的图形,alpha=0全透明,让下面的图形全部透出来,自己就看不见了。

    swfObjectSetNoFill方法用于设置对象不填充,SetSolidFill用于设置对象用单色填充,也可以用alpha规定透明程度。SetLinearFill方法用于设置对象从一个颜色到另外一个颜色线性逐渐过渡,SetLinearFillCenter方法用于设置颜色线性过渡的中心点,SetRadialFill方法用于设置对象从一个颜色到另外一个颜色放射性逐渐过渡,SetRadialFillCenter方法用于设置颜色放射性过渡的中心点。

           swfObject变成按钮的方法的过程稍微复杂些,因为按钮需要四个图形,分别代表按钮普通状态、鼠标划过状态、鼠标下落状态和提示状态的图形。按钮被按动后将激发的动作,需要用QueueEvent方法加入动作对象。

    3、swfAction 动作对象

    目前,Bukoo Flash Objects支持五个动作,停止动画、播放动画、跳转到某个帧、导航到URL,以及在使某个html frame 导航到URL。与swfObject一样,swfAction对象创建后,可以用MakeActionStopMakeActionPlayMakeActionGotoFrameMakeActionGotoURL以及MakeActionGotoURLTarget变成相应的动作。

           可以在每个帧中插入停止动画的动作,并插入按钮对象,按钮对象激活跳转帧动作,首先交互式动画。

           完整的对象接口,请参考文件obj_interface.htm,下面结合ASP Delphi示范如何使用Bukoo Flash Object

    四、ASP范例

           这个ASP程序(sample1.asp)将动态创建的Flash动画包含放射性填充背景、一个自右向左移动的文字和三个扩张的圆形, SWF文件将以二进制流的方式被写入到浏览器中。

    <%

        ' 创建 Bukoo Flash Objects

        Set movie = Server.CreateObject("swfobjs.swfMovie")

        Set obj = Server.CreateObject("swfobjs.swfObject")

        ' 设置动画属性

        with movie

            .SetSize 6000, 1000

            .SetFrameBkColor 255, 255, 255

            .SetFrameRate 20

        end with

        ' 创建放射性填充背景

        with obj

            .MakeRectangle 0, 0, 5980, 980

            .SetRadialFill 255, 255, 255, 255, 196, 196, 255, 255

            .SetRadialFillCenter 1000, 500

            .SetDepth 0

        end with

        movie.AddObject obj

        ' 创建字体

        Set font = Server.CreateObject("swfobjs.swfObject")

        with font

            .MakeFont "MyFont"

            .AddGlyph "Arial", "Bukoo", AscW("B")

            .AddGlyph "Arial", " ", AscW(" ")

            .AddGlyph "Arial", "is coming soon", AscW("I")

        end with

       

        ' 生成移动的文字

        Set txt = Server.CreateObject("swfobjs.swfObject")

        txt.MakeText "B I", font

        txt.Scale 40000, 40000

        txt.SetSolidFill 196, 0, 255, 255

        txt.SetDepth 1   

        for ii = 0 to 240

            movie.GotoFrame ii

            if ii > 0 then movie.RemoveObject txt       

            txt.translate 5000-ii*50, 100    

            movie.AddObject txt   

        next

        ' 生成第一个圆形,淡绿色,半透明

        for ii = 1 to 60

            movie.GotoFrame ii + 20

            if ii > 1 then movie.RemoveObject obj

            if ii < 60 then

            with obj

                .MakeCircle 1000, 500, 80 * ii

                .SetNoFill

                .SetLineColorA 128, 255, 128, 224

                .SetLineWidth 200

                .SetDepth 1

            end with

            movie.AddObject obj   

            end if

        next

        ' 生成第二个圆形,淡黄色,半透明

        for ii = 1 to 60

            movie.GotoFrame ii + 100

            if ii > 1 then movie.RemoveObject obj

            if ii < 60 then

            with obj

                .MakeCircle 1000, 500, 80 * ii

                .SetNoFill

                .SetLineColorA 255, 255, 128, 224

                .SetLineWidth 200

                .SetDepth 2

            end with

            movie.AddObject obj   

            end if

        next

        ' 生成第三个圆形,淡红色,半透明

        for ii = 1 to 60

            movie.GotoFrame ii + 180

            if ii > 1 then movie.RemoveObject obj

            if ii < 60 then

            with obj

                .MakeCircle 1000, 500, 80 * ii

                .SetNoFill

                .SetLineColorA 255, 128, 128, 224

                .SetLineWidth 200

                .SetDepth 3

            end with

            movie.AddObject obj   

            end if

        next

        '20帧加入声音

        movie.GotoFrame 20

        obj.MakeSound "c:"audio.WAV"

        movie.AddObject obj

        ' 创建文件

        movie.MakeMovie

        ' 将文件写入浏览器

        response.contentType = "application/x-shockwave-flash"

        response.buffer = false

        response.binarywrite movie.Content

        ' 删除临时文件

        movie.DeleteTempFile

    %>

    如果需要将动态生成的Flash动画插入其他网页,可以用参照 dispswf.asp 来做,以下是 dispswf.asp的内容。

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

    <title>Bukoo Flash Objects Test</title>

    </head>

    <%

           swf_url = request("swf_url")

           width = request("width")

           height = request("height")

    %>

    <body background="bg.gif">

    <p><strong><font face="Verdana">Welcome to use Bukoo Flash Objects with ASP </font></strong></p>

    <p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

    codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0"

    WIDTH="<%=width%>" HEIGHT="<%=height%>">

     <param name="movie" value="<%=swf_url%>">

     <param name="quality" value="high">

     <param name="bgcolor" value="#FFFFFF"><embed src="<%=swf_url%>" quality="high" bgcolor="#FFFFFF" WIDTH="<%=width%>" HEIGHT="<%=height%>" TYPE="application/x-shockwave-flash"

    PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version =ShockwaveFlash">

    </object>

    </p>

    </body>

    </html>

    两个ASP配合使用的URL为:

    http://localhost/swf/dispswf.asp?swf_url=sample1.asp&width=300&height=50

    结果如下图所示:


    五、Delphi范例

     

           以下Delphi程序使用Bukoo Flash Objects创建包含放射性填充背景和一个旋转并缩小文字的Flash动画,所生成的SWF文件被写入磁盘,并用Flash ActiveX Contorl 显示出来。

    unit Unit2;

    interface

    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, ShockwaveFlashObjects_TLB;

    type

        TForm1 = class(TForm)

        Button1: TButton;

        ShockwaveFlash1: TShockwaveFlash;

        Button2: TButton;

        Button3: TButton;

        procedure Button1Click(Sender: TObject);

        procedure Button2Click(Sender: TObject);

        procedure Button3Click(Sender: TObject);

    private

        { Private declarations }

    public

        { Public declarations }

    end;

    var

    Form1: TForm1;

    implementation

    {$R *.DFM}

    uses comObj, ShellAPI;

    procedure TForm1.Button2Click(Sender: TObject);

    begin

    // 控制Flash ActiveX Control 播发动画

        ShockwaveFlash1.play;

    end;

    procedure TForm1.Button3Click(Sender: TObject);

    begin

    // 控制Flash ActiveX Control 停止播发动画

        ShockwaveFlash1.Stop;

    end;

    procedure TForm1.Button1Click(Sender: TObject);

    const filename = 'c:"sample2.swf';

    var vv, txt, obj: variant;

          ii: integer;

    begin

           // 创建Bukoo Flash Objects

        vv := CreateOLEObject('swfObjs.swfMovie');

        vv.SetSize(6400, 3700);

        txt := CreateOLEObject('swfObjs.swfObject');

        obj := CreateOLEObject('swfObjs.swfObject');

           // 创建反射线填充背景

        obj.MakeRectangle(0, 0, 6380, 3680);

        obj.SetRadialFill(255, 255, 255, 255, 255, 224, 224, 255);

        obj.SetRadialFillCenter (3190, 1895);

        obj.SetDepth(0);

        vv.AddObject(obj);

           // 创建字体

        obj.MakeFont('MyFont');

        obj.AddGlyph('Arial', 'Hello,', ord('H'));

        obj.AddGlyph('Arial', 'Bukoo', ord('B'));

           // 创建文字

        txt.MakeText('HB', obj);

        txt.translate(500, 1500);

        txt.SetSolidFill(255, 0, 0, 250);

        txt.Scale(65536 div 2, 65536 div 2);

        vv.AddObject(txt);

           // 旋转和缩小文字

        for ii := 10 to 50 do begin

            vv.GotoFrame(ii);

            if ii >= 10 then vv.RemoveObject(txt);

            txt.rotate( (50-ii)*65536 * 9);

            txt.Scale( (60-ii)*6553, (60-ii)*6553);

            txt.SetSolidFill(255, 0, 0, (ii-9)*5);

            vv.AddObject(txt);

        end;

           // 输出SWF文件

        vv.WriteMovie(filename);

    // SWF载入Flash ActiveX Contorl显示

        ShockwaveFlash1.Movie := filename;

        ShockwaveFlash1.play;

    end;

    end.

    程序运行结果如下图。

     


     

    六、进一步讨论

           通过COM技术,Bukoo Flash Objects VC++以外的其他程序设计语言或者环境,与VC++SWF SDK之间架设了桥梁,使得利用ASPDelphi和其他语言,如VB能够以很方便简洁的的方式制作Flash动画。

           但是,SWF SDK中包含了许多错误(bug),下载和使用SWF SDK的读者需要额外注意,例如,其中没有将TrueType字体转换为Flash字体的功能、对象的几何变换公式是错误的等等。这些问题在openswf.orgflashkit.com的讨论组中有很多讨论。笔者在制作Bukoo Flash Objects时,已经尽量改了一批类似的缺陷和错误。估计难免还有遗漏之处,这将大大影响Bukoo Flash Objects的质量。随着Flash 5 的正式发布,预计SWF 5 SDK不久也会推出,希望它能修正其中的bug,届时笔者将用新的SDK重新编译Bukoo Flash Objects

           下一个版本的Bukoo Flash Objects计划将增加对中文、对嵌如入动画(sprite)和对变形(morph)的支持。

    欢迎读者对Bukoo Flash Objects提出建议和批评。

    孙以义

    yysun@263.net

    2000/8/28

    Ypsilanti, MI USA

    参考网站

    http://www.macromedia.com/software/flash/open/licensing/

    http://www.openswf.org/

    http://flashkit.com/board/forumdisplay.php?forumid=23

    news://forums.macromedia.com/macromedia.open-swf



    [1] http://www.macromedia.com/software/flash/survey/

    [2] http://www.macromedia.com/software/flash/open/licensing/fileformat/

    [3] 这个版本的Bukoo Flash Objects还不能转换中文字体,下一个版本中将增加这个功能。

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/Athrun/p/1540878.html
Copyright © 2011-2022 走看看