Как использовать содержимое Flash в приложении Java Micro Edition?

#java #flash #java-me

#java #flash #java-me

Вопрос:

Несмотря на мои луддитские наклонности, теперь у меня есть телефон с поддержкой Java, но без поддержки Flash. У меня также есть копия Macromedia Flash MX2004, хотя я вряд ли собираюсь обновляться в ближайшее время.

Что я хотел бы иметь возможность делать, так это разрабатывать некоторый контент (включая векторные анимации) во Flash, а затем использовать эти ресурсы в приложении Java Micro Edition. Мне не нужны все возможности Flash — в частности, меня не волнует поддержка ActionScript. Но я действительно хочу иметь возможность загружать SWF-файл (или, что, возможно, лучше, альтернативный формат файла, который можно сгенерировать с помощью инструмента преобразования) и иметь возможность отображать анимацию и использовать другие ресурсы (в частности, воспроизводить звуки) из этого файла.

Есть ли хорошая библиотека и инструментарий для поддержки такого рода вещей? Очевидно (из MX2004), что ему не обязательно быть полностью обновленным.

На уровне знаний — я был программистом в течение десятилетий, и мой повседневный язык в эти дни — C . Однако у меня очень ограниченные знания о Java и практически никаких знаний (пока) о Micro Edition и его библиотеках.

Я уже слышал о преобразователях Flash в J2ME, но, насколько я могу видеть, они генерируют готовые приложения за один шаг, вместо того, чтобы рассматривать SWF-файл как источник ресурсов, которыми можно управлять из отдельно написанного Java-кода.

Редактировать

У меня такое ощущение, что это (с небольшими изменениями), вероятно, довольно просто. Java Mobile Edition поддерживает векторную графику SVG. SVG поддерживает анимацию. Существуют (я почти уверен) способы преобразования flash-анимации в SVG — вероятно, простой экспорт в SVG в приложении, хотя я не проверял.

Это само по себе не дает мне удобного формата файла bundle of media resources, но это относительно простая проблема для решения, если есть способ «загрузить» SVG и другие медиафайлы из какого-либо класса потока, не связанного с файлом, который, в свою очередь, получает свои данные из файла bundle of media.

Ответ №1:

Я никогда раньше не использовал Java ME, поэтому не смогу помочь с этой стороны, но я использую actionscript / flash на ежедневной основе.

«Самая простая» вещь, о которой я могу подумать, — это двухэтапный процесс:

  1. Экспортируйте анимацию в виде векторной последовательности с помощью File> Export> Экспортировать фильм и выбрав правильный формат (например, .ai /.eps /.dxf).
  2. Преобразуйте векторную последовательность в svg. В Inkscape есть несколько удобных инструментов преобразования SVG.

Более трудоемким способом было бы написать скрипт JSFL во Flash MX 2004. Вы должны перемещаться по фигурам для каждого фрейма, затем записать данные пути в SVG. Другим, немного отличающимся способом было бы экспортировать векторную последовательность, как описано выше (к сожалению, нет функциональности JSFL для автоматизации этого), затем из JSFL считывать и перебирать каждый файл, анализировать его и записывать SVG. Единственное преимущество, которое это дало бы вам, — это отсутствие необходимости устанавливать Inkscape и переключаться на другое приложение. Я бы не рекомендовал этого, потому что:

  1. Вам нужно будет написать анализатор (dxf / eps может быть самым простым)
  2. Вам нужно будет создать SVG, и в вашем распоряжении будут только строки (поддержка E4X XML была добавлена во Flash CS3)

Я не говорю, что это невозможно, это просто кажется непрактичным.

Нашел эту тему на форуме Inkscape, в которой рассказывается о скрипте bash, который

извлекает SWF-объекты в SVG-файл

использую SWFTools, но еще не пробовал. Для справки, вот скрипт хади:

 #!/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.

Комментарии:

1. Спасибо — предложение Inkscape выглядит хорошим, хотя оно также поднимает вопрос «почему бы не забыть Flash и анимировать с помощью Inkscape?».

2. 🙂 заглянул в Inkscape wiki ( wiki.inkscape.org/wiki/index.php/SVG_Animation ) и это интересно. Я не уверен, что у вас будет такая же гибкость для вложенных символов / управления временной шкалой / и т.д. Но опять же, вам могут понадобиться только некоторые базовые настройки.

3. Мне придется немного поиграть — с обоими. Я не эксперт по Flash. Я купил studio mx2004 и creative suite cs2 в то время, когда у меня было немного больше денег, чем смысла. Я, честно говоря, тоже не жалею, но я и не претендую на то, чтобы быть каким-либо экспертом. То, что застряло, также было в основном CS2, а не MX2004. Отчасти эта миссия началась как предлог для того, чтобы снова поработать с Flash после довольно длительного перерыва. Таким образом, несмотря на наличие функций, нет гарантии, что я буду часто их использовать — хотя вложенные символы кажутся довольно болезненной потерей.

4. Я забыл об этом, и у меня больше нет этого телефона — он у моей племянницы. Принято — Я так и не решил проблему, но это, вероятно, помогло бы , если бы я это сделал.