2011-05-11 57 views
1

儘管我有luddite的傾向,我現在有一個電話與Java支持 - 但沒有Flash支持。我也有一個Macromedia Flash MX2004的副本,儘管我不可能很快升級。如何在Java Micro Edition應用程序中使用Flash內容?

我希望能夠做的是在Flash中開發一些內容(包括矢量動畫),然後在Java Micro Edition應用程序中使用這些資源。我不需要Flash的所有功能 - 特別是,我不關心ActionScript支持。但我確實希望能夠加載SWF文件(或者更好的是,可以使用轉換工具生成的替代文件格式),並且能夠顯示動畫並使用其他資源(尤其是播放聲音)該文件。

有沒有一個好的庫和工具包來支持這種事情?顯然(從MX2004開始)它不需要完全更新。

關於知識水平 - 我幾十年來一直是程序員,現在我的日常語言是C++。但是,我對Java的知識非常有限,幾乎沒有Micro Edition及其庫的知識。

我已經聽說過J2ME轉換器的Flash,但據我看到,他們只需一步就可以生成完整的應用程序,而不是將SWF文件視爲從單獨編寫的Java代碼進行控制的資源來源。

編輯

給我的感覺,這是(略有修改)可能相當容易。 Java移動版支持SVG矢量圖形。 SVG支持動畫。有(我非常確定)將Flash動畫轉換爲SVG的方法 - 可能是應用程序中的簡單導出到SVG,但我沒有檢查過。

這本身並沒有給我一個方便的媒體資源文件格式,但這是一個相對簡單的問題要解決,只要有一種方法來「加載」某種SVG和其他媒體文件非文件流類,它從媒體包文件中依次獲取其數據。

回答

1

我以前從未使用Java ME,所以我無法在這方面提供幫助,但我每天都使用actionscript/flash。

的「最簡單」的事我能想到的是2個步驟:

  1. 導出通過文件>導出>導出影片動畫爲載體序列,並選擇正確的格式(例如.AI/.EPS/.DXF)。
  2. 將矢量序列轉換爲svg。 Inkscape有幾個方便的SVG conversion tools

一個長篇大論辦法是在Flash MX 2004年寫了一個劇本JSFL您 將traverse the shapes每個幀,那麼路徑數據寫入到SVG。 另一個稍微不同的方式是導出矢量序列,如上所述(遺憾的是,沒有JSFL功能來自動執行),然後從JSFL讀取並循環遍歷每個文件,解析它並編寫SVG。 這會給你帶來的唯一好處就是不必安裝Inkscape,你不需要切換到另一個應用程序。 我不會推薦這雖然是因爲:

  1. 你需要編寫一個解析器(DXF/EPS可能是最簡單的)
  2. 您將需要作出SVG,你只需要串在您的處置(在Flash CS3中添加了E4X XML支持)

我不是說這是不可能的,它似乎不切實際。

在Inkscape的論壇共享該

提取SWF對象到SVG文件

使用SWFTools bash腳本找到this thread,但還沒有嘗試過呢。作爲參考,在這裏是哈迪的劇本:

#!/bin/bash 

#USAGE ./swf2svg.sh /path/to/file.swf > output.svg 

FILE=$1; 
DUMP="dump.txt" 

echo '<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 

<svg width="100%" height="100%" version="1.1" 
xmlns="http://www.w3.org/2000/svg"> 

'; 

swfdump -s $FILE > $DUMP 

fillCols=(); 
lineCols=(); 
lineWidth=(); 

FILLREGEX="[0-9]+(\s*)SOLID [0-f]{8}"; 
LINEREGEX="[0-9]+(\s*)[0-9]\.[0-9]{0,2} [0-f]{8}"; 

lastStartPoint=""; 
pathClosedTag=""; 
firstGroup="TRUE"; 
firstPath="TRUE"; 

cat $DUMP | while read line 
do 
    #Remove (and) 
    line=`echo $line | sed "s/[()]//g"` 

    #tmp=`echo $line | egrep -o "DEFINE(SHAPE|SPRITE)"`; 
    tmp=`echo $line | egrep -o "DEFINE(SHAPE|SPRITE)[0-9]? defines id [0-9]+"`; 

    if [ "$tmp" != "" ] 
    then 
     if [ "$firstGroup" == "TRUE" ] 
     then 
     firstGroup="FALSE"; 
     else 
     if [ "$firstPath" == "FALSE" ] 
     then 
      if [ "$lastStartPoint" != "" ] 
      then 
       if [ "$lastStartPoint" == "$curPoint" ] 
       then 
        pathClosedTag="Z"; 
       fi 
      fi 

      lastStartPoint=$curPoint; 
      echo $pathClosedTag'" />'; 
     fi; 
     firstPath="TRUE"; 
     echo '</g>'; 
     fi 

     id=`echo $tmp | awk {'print $4'}` 

     echo '<g id="'$id'">'; 
     fillCols=(); 
     lineCols=(); 
     lineWidth=(); 
    fi 

    tmp=`echo $line | egrep -o "($FILLREGEX)?((\s*)$LINEREGEX)?"`; 
    if [ "$tmp" != "" ] 
    then 
     fillInx=`echo $tmp | egrep -o "$FILLREGEX" | awk {'print $1'}`; 
     fillCol=`echo $tmp | egrep -o "$FILLREGEX" | awk {'print $3'}`; 

     if [ "$fillCol" != "" ] 
     then 
     fillCols[$fillInx]=$fillCol; 
     fi 

     lineInx=`echo $tmp | egrep -o "$LINEREGEX" | awk {'print $1'}`; 
     lineWth=`echo $tmp | egrep -o "$LINEREGEX" | awk {'print $2'}`; 
     lineCol=`echo $tmp | egrep -o "$LINEREGEX" | awk {'print $3'}`; 
     if [ "$lineCol" != "" ] 
     then 
     lineCols[$lineInx]=$lineCol; 
     lineWidth[$lineInx]=$lineWth; 
     fi 
    fi 

    tmp=`echo $line | awk {'print $6'}`; 

    if [ "$tmp" == "lineTo" ] 
    then 
     echo $line | awk {'print "L"$7" "$8'} 
    fi 

    if [ "$tmp" == "moveTo" ] 
    then 

     curPoint=`echo $line | awk {'print $9" "$10'}`; 

     if [ "$lastStartPoint" != "" ] 
     then 
     if [ "$lastStartPoint" == "$curPoint" ] 
     then 
      pathClosedTag="Z"; 
     fi 
     fi 

     lastStartPoint=$curPoint; 

     if [ "$firstPath" == "TRUE" ] 
     then 
     firstPath="FALSE"; 
     else 
     echo $pathClosedTag'" />'; 
     fi; 

     #Remove : and/
     line=`echo $line | sed "s/[:/]/ /g"` 

     fInx=`echo $line | awk '{printf "%d", $4}'`; 
     lInx=`echo $line | awk '{printf "%d", $6}'`; 

     stl=""; 
     val=${fillCols[$fInx]:0:6}; 
     if [ $fInx -gt 0 -a "$val" != "" ] 
     then 
     stl="fill:#$val;"; 
     fi 

     val=${lineCols[$lInx]:0:6}; 
     if [ $lInx -gt 0 -a "$val" != "" ] 
     then 
     stl=$stl"stroke:#$val;"; 

     val=${lineWidth[$lInx]}; 
     if [ "$val" != "" ] 
     then 
      stl=$stl"stroke-width:$val;"; 

     fi 
     fi 

     echo '<path style="'$stl'" d="'; 
     echo $line | awk {'print "M"$9" "$10'} 
    fi 

    if [ "$tmp" == "splineTo" ] 
    then 
     echo $line | awk {'print "Q"$7" "$8" "$9" "$10'} 
    fi 

done 
echo 'Z" />'; 
echo '</g>'; 
echo '</svg>'; 

如果別人使用Flash的一個較新版本(如CS4或CS5)讀取此,有可用的Flash 2 SVG extension

+0

謝謝 - Inkscape的建議看起來不錯,但它也提出了「爲什麼不忘記使用Inkscape進行Flash和動畫製作?」的問題。 – Steve314 2011-05-12 22:39:16

+0

:)看了一下Inkscape wiki(http://wiki.inkscape.org/wiki/index.php/SVG_Animation),它很有趣。我不確定您是否對嵌套的符號/時間線控制/等具有相同的靈活性。但是你可能只需要一些基本的補間。 – 2011-05-12 23:27:15

+0

我必須玩一下 - 兩者都有。我不是Flash專家。我買了studio mx2004和創意套裝cs2,當時我的錢比感覺多一點。我也沒有誠實地後悔,但我不認爲是任何一種專家。什麼棒也主要是CS2而不是MX2004。部分原因是這項任務是在經過相當長時間的休息之後再次混淆了Flash的藉口。所以即使功能在那裏,但我不能保證我會使用它們 - 儘管嵌套符號似乎是一個非常痛苦的損失。 – Steve314 2011-05-12 23:54:06

相關問題