#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 на ежедневной основе.
«Самая простая» вещь, о которой я могу подумать, — это двухэтапный процесс:
- Экспортируйте анимацию в виде векторной последовательности с помощью File> Export> Экспортировать фильм и выбрав правильный формат (например, .ai /.eps /.dxf).
- Преобразуйте векторную последовательность в svg. В Inkscape есть несколько удобных инструментов преобразования SVG.
Более трудоемким способом было бы написать скрипт JSFL во Flash MX 2004. Вы должны перемещаться по фигурам для каждого фрейма, затем записать данные пути в SVG. Другим, немного отличающимся способом было бы экспортировать векторную последовательность, как описано выше (к сожалению, нет функциональности JSFL для автоматизации этого), затем из JSFL считывать и перебирать каждый файл, анализировать его и записывать SVG. Единственное преимущество, которое это дало бы вам, — это отсутствие необходимости устанавливать Inkscape и переключаться на другое приложение. Я бы не рекомендовал этого, потому что:
- Вам нужно будет написать анализатор (dxf / eps может быть самым простым)
- Вам нужно будет создать 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. Я забыл об этом, и у меня больше нет этого телефона — он у моей племянницы. Принято — Я так и не решил проблему, но это, вероятно, помогло бы , если бы я это сделал.