Можно ли сделать тег Flash CS4 [embed] для экспорта ресурсов в кадр 2, а не в кадр 1? - PullRequest
2 голосов
/ 11 января 2010

Мы работаем над проектом Flash CS4, в котором размер основного файла .fla увеличился, а «Публикация» занимает вечность. Я подозреваю, что большой размер (и, по крайней мере, часть времени компиляции) связан с количеством звуковых символов в библиотеке.

Я бы хотел удалить этот ненужный наворот из файла .fla. Я экспериментировал с удалением звукового символа из библиотеки и использованием вместо него тега метаданных [embed], например:

[Embed(source="audio/music/EndOfLevelDitty.mp3")]
public var EndOfLevelDitty:Class

Полученный опубликованный файл работает отлично, но есть проблема. Наша игра использует предварительный загрузчик на первом кадре временной шкалы, поэтому все другие классы необходимо экспортировать во втором кадре (как установлено в Параметры публикации> Параметры ActionScript 3.0 ). Поэтому отчет о размере обычно начинается так:

Frame #    Frame Bytes    Total Bytes    Scene
-------    -----------    -----------    ----------------
      1         284515         284515    Scene 1
      2        5485305        5769820     (AS 3.0 Classes Export Frame)

Однако, если я использую тег [embed] для небольшого звука, мой отчет о размере будет:

Frame #    Frame Bytes    Total Bytes    Scene
-------    -----------    -----------    ----------------
      1         363320         363320    Scene 1
      2        5407240        5770560     (AS 3.0 Classes Export Frame)

Как видите, встроенный звук был экспортирован в кадр 1, а не в кадр 2. Если бы я вставил все звуки таким образом, размер кадра 1 вырос бы до огромного, и пользователи смотрели бы на белый экран целую вечность до того, как загружен кадр предварительной загрузки.

Так что мой вопрос таков: могу ли я использовать тег [embed], но экспортировать встроенный ресурс в кадре 2 вместо кадра 1?

Ограничения проекта:

  • Состав нашей команды означает, что на данном этапе мы не можем перейти на чистый Flex.
  • Скомпилированный .swf должен быть «все в одном», поэтому мы не можем разбить предварительный загрузчик на отдельный файл и не можем получить доступ к внешним ресурсам.

Редактировать : Я бы также согласился на то, чтобы аудио было во встроенной библиотеке SWC, но, похоже, также нет способа встроить звук во фрейм 2; это всегда заканчивается в кадре 1.

Ответы [ 3 ]

0 голосов
/ 11 января 2010

Мне нравится ответ Патрика, звучит так, будто он должен работать.

Вы можете также подумать о том, чтобы написать свой предварительный загрузчик в другом .swf - это довольно просто сделать, и вы избегаете всего этого хрена frame1 / frame2. :)

0 голосов
/ 12 января 2010

В конце концов, я просто устал от всего, что происходит во Flash, и решил собрать предварительный загрузчик (только) во Flex, встроив игровой SWF в предварительный загрузчик и загрузив его с помощью SWFLoader.(Это основано на предложении Myk.) У меня все еще есть один SWF в конце, с более надежной системой предварительной загрузки Flex, обрабатывающей экран предварительного загрузчика.

В конце я не использовал полный Flex Builder;Я только что скомпилировал материал Flex с помощью mxmlc из бесплатного пакета Flex SDK.

Вот мой файл mxml (я действительно не знаю, что я делаю с mxml, поэтому, пожалуйста, кто-нибудь скажет мне, если этот подход неправильный):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" preloader="CustomPreloader" width="755" height="500" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#000000, #000000]" frameRate="30">
<mx:SWFLoader source="@Embed(source='../../trunk/Game.swf')" width="755" height="500" x="0" scaleContent="false" y="0"/>
</mx:Application>

(CustomPreloader - это простой класс, расширяющий mx.preloaders.DownloadProgressBar.)

Что мне нравится в этом подходе, так это то, что теперь я могу делать на Flash все, что захочубоковая сторона;Я могу перестать беспокоиться о том, на какие классы фреймов экспортируются.

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

0 голосов
/ 11 января 2010

Почему бы просто не поместить свой актив в нужный вам кадр: создайте новый класс с вашими активами:

public class Assets extends Sprite {
 [Embed(source="audio/music/EndOfLevelDitty.mp3")]
 public var EndOfLevelDitty:Class;

 public function Assets() {
  super();
 }
} 

затем в flash IDE создайте новый символ и сделайте так, чтобы он расширял ваш класс Assets, и поместите этот символ в нужный кадр

...