php下swf开发技术文档

准备资料

1)swfmill 通过swfmill工具生成swf文件。 参考: http://www.swfmill.org/ 
2)swfeditor 通过swfeditor工具来编辑swf文件。参考: http://zh.sourceforge.jp/projects/swfed/wiki/SWFEditor.replaceActionStrings?action=showhist&text_id=70348 
3)反编译工具Flash Decompiler Trillix 通过此工具可以反编译swf文件。 参考:http://flash-decompiler-trillix.softonic.cn/ 
4)swf文件格式说明书:http://wenku.baidu.com/view/5bb4ad34eefdc8d376ee3296.html 
5)  swfmill命令实例: 
   xml转swf            
   例如 E:\swfmill-0.3.2-win32\swfmill xml2swf E:\13_1_0.xml E:\13_1_0.swf
   swf转xml            
   例如 E:\swfmill-0.3.2-win32\swfmill swf2xml E:\13_1_0.swf E:\13_1_0.xml

流程图

构造Swf模板

 Swf文件生成所依赖的模板就是一个Xml文件,通过编辑此xml文件来控制swf文件的画面以及事件。所以要创建swf模板必须先了解,模板中的各个标签的含义及用法。    

标签介绍:     SWF中有两种类型的标签(Tag):    

定义型标签(Tag):这种标签(Tag)定义SWF动画的内容如:变形、文本、位图、声音等。每个定义标签(Tag)定义一个唯一的字符型ID来标示它定义的内容。播放器存储这些字符ID到一个叫做字典(Dictionary)库中。定义标签(Tag)完全由系统自己完成。    

控制标签(Tag):这种标签(Tag)建立和操作字典(Dictionary)中的字符标示的实例(Instance)并且控制动画的播放。   SWF中的标签(Tag)顺序:     一般来说,SWF中的标签(Tag)可以任意排列。

然而,必须遵循下面的几点小的规则:    

1.     标签(Tag)仅仅依靠它上面的标签(Tag)。一个文件中只能有一个结束标签(Tag)。    

2.     定义标签(Tag)必须定义字符标示在所有控制标签(Tag)之前。    

3.     声音流标签(Tag)必须顺序排放。错误的排列(Out-of-order)的声音流标签(Tag)会导致播放错误(Out-of-order)。    

4.     结束标签(Tag)必须在SWF文件末尾。           

Header:swf文件头,每个swf文件都有一个文件头。     

framerate: (帧速)表示 每秒帧的播放速度。    

frames:总的帧数   size:定义画面的大小    

Rectangle:矩形,单位为twig,1twig=1/20pixels     left:左边位置    right:右边位置    top:顶端位置    bottom:底端位置   

SetBackgroundColor:设置背景色    color:颜色定义标签     red:红色值    green:绿色值    blue:蓝色值   

DefineShape:定义形状     

objectID:对象ID的值   

bounds:形状对象要限定的形状。    

styles:样式    StyleList:样式列表    fillStyles:要填充的样式    Solid:样式为密实的    

DefineSprite:定义图形标签,利用其他的字符内容来定义他们自己的内容    

DoAction:要执行的动作    actions:动作集    Play:执行播放动作    Stop:执行播放停止动作    EndAction:动作结束标签    

PlaceObject2:在播放目录中增加一个标识符并设置标识符的深度值。     

replace:replace=“0”表示该深度值上没有其他元素,该元素为新增的,replace=“1”表示该深度值上有一个元素,要用新元素替换。    

depth:标识符的深度值   

transform:定义变形    transform:定义变形     scaleX:沿x坐标放大的系数    scaleY:沿y坐标放大的系数    transX:沿x坐标移动的值    transY:沿y坐标移动的值   

events:事件集标签    GotoFrame:跳转到某一帧     frame:帧的数值   ShowFrame:按播放目录的顺序播放。                  

例如:

 

<?xml version="1.0" encoding="UTF-8"?>
<swf version="7" compressed="1">
  <Header framerate="12" frames="1">
    <size>
      <Rectangle left="0" right="11000" top="0" bottom="8000"/>
    </size>
    <tags>
      <SetBackgroundColor>
        <color>
          <Color red="255" green="255" blue="255"/>
        </color>
      </SetBackgroundColor>
      <DefineShape objectID="1">
        <bounds>
          <Rectangle left="-6698" right="-5978" top="-1680" bottom="-960"/>
        </bounds>
        <styles>
          <StyleList>
            <fillStyles>
              <Solid>
                <color>
                  <Color red="0" green="102" blue="255"/>
                </color>
              </Solid>
            </fillStyles>
            <lineStyles/>
          </StyleList>
        </styles>
        <shapes>
          <Shape>
            <edges>
              <ShapeSetup x="-6698" y="-1680" fillStyle1="1"/>
              <LineTo x="720" y="0"/>
              <LineTo x="0" y="720"/>
              <LineTo x="-720" y="0"/>
              <LineTo x="0" y="-720"/>
              <ShapeSetup/>
            </edges>
          </Shape>
        </shapes>
      </DefineShape>
      <DefineShape objectID="2">
        <bounds>
          <Rectangle left="-6698" right="-5978" top="-1680" bottom="-960"/>
        </bounds>
        <styles>
          <StyleList>
            <fillStyles>
              <Solid>
                <color>
                  <Color red="0" green="255" blue="102"/>
                </color>
              </Solid>
            </fillStyles>
            <lineStyles/>
          </StyleList>
        </styles>
        <shapes>
          <Shape>
            <edges>
              <ShapeSetup x="-6698" y="-1680" fillStyle1="1"/>
              <LineTo x="720" y="0"/>
              <LineTo x="0" y="720"/>
              <LineTo x="-720" y="0"/>
              <LineTo x="0" y="-720"/>
              <ShapeSetup/>
            </edges>
          </Shape>
        </shapes>
      </DefineShape>
      <DefineSprite objectID="3" frames="2">
        <tags>
          <DoAction>
            <actions>
              <Stop/>
              <EndAction/>
            </actions>
          </DoAction>
          <PlaceObject2 replace="0" depth="1" objectID="1">
            <transform>
              <Transform transX="0" transY="0"/>
            </transform>
          </PlaceObject2>
          <ShowFrame/>
          <DoAction>
            <actions>
              <Stop/>
              <EndAction/>
            </actions>
          </DoAction>
          <PlaceObject2 replace="1" depth="1" objectID="2"/>
          <ShowFrame/>
          <End/>
        </tags>
      </DefineSprite>
      <PlaceObject2 replace="0" depth="1" objectID="3" allflags1="3072" allflags2="0">
        <transform>
          <Transform scaleX="5.250000000000000" scaleY="6.313888549804688" transX="38567" transY="12095"/>
        </transform>
        <events>
          <Event flags1="1024" flags2="0">
            <actions>
              <GotoFrame frame="1"/>
              <Play/>
              <EndAction/>
            </actions>
          </Event>
          <Event flags1="2048" flags2="0">
            <actions>
              <GotoFrame frame="0"/>
              <Play/>
              <EndAction/>
            </actions>
          </Event>
          <Event flags1="0" flags2="0"/>
        </events>
      </PlaceObject2>
      <ShowFrame/>
      <End/>
    </tags>
  </Header>
</swf>


swf的生成

生成过程:swf文件的生成是根据预先定义好的Xml模板进行的,通过调用swfmill程序来把xml文件转化为swf文件。 
 在linux系统下,php可以通过popen配合pclose来实现,执行swfmill命令。
 

/** 
 * create swf file with command 
 */ 
private function  createSwf() 
{ 
 // Swfmill execute command
 $cmd = $this->swffill_command.' '.$this->outputXml.' '.$this->outputSwf;// 获取swfmill的命令
 
 $handle = popen($cmd, 'r'); // 通过popen函数来执行swfmill的命令
 pclose($handle);
} 

 

swf的编辑

 编辑过程:通过指定路径,获取swf文件,然后通过swfeditor对其进行编辑。例如可以修改,添加,删除节点。  

/**        
 * prepare for flash file        
 */        
function prepareFlash($flashParam){        
        
    $userName = $this->getUserName();    
    $userFamilyname = $this->getUserFamilyname();    
    // get swf file    
    $swfPath = $this->container->getParameter('SWF_Path'); // 获取swf文件的路径    
    if ($this->getRequest()->getSession()->has('SANDBOX'))    
    {    
        $swfPath = $this->container->getParameter('SWF_Path_DEV');
    }    
        
    $swfFilename = getcwd().$swfPath."/".$this->getPlatform()."/".$flashParam["swfId"].".swf"; // 根据swf文件路径获得swf文件名    
    $tempSwf = getcwd().$swfPath."/".$this->getPlatform()."/".$flashParam["swfId"]."tmp.swf";    
        
    if(!file_exists($swfFilename)){    
        throw new \Exception("File does not exist! file:".$swfFilename);
    }    
        
    $swfdata = file_get_contents($swfFilename); // 取得swf文件的内容    
    $url =     $this->buildSwfUrl("game/scene5/game_u110_continue");
    $obj = new \SWFEditor();// 创建swfeditor对象    
    $obj->input($swfdata); // 对象载入swf文件内容    
    $variableName = array('NAME' => $userName, 'FNAME' => $userFamilyname);    
    $obj->setActionVariables($variableName);// 修改变量    
    $variableUrl = array('#?' => $url);    
    $obj->replaceActionStrings($variableUrl); // 替换字符串    
    file_put_contents($tempSwf,$obj->output()); // 重新生成swf文件    
    $flashParam["swf"] = $flashParam["img_root"].$swfPath."/".$this->getPlatform()."/".$flashParam["swfId"]."tmp.swf";    
        
    return $flashParam;    
}        

 

posted @ 2013-01-06 10:20  V.Wang  阅读(862)  评论(0)    收藏  举报