PDA

Просмотр полной версии : Библиотека ресурсов при помощи mxmlc


Aloran
12.04.2011, 19:16
Создаю библиотеку ресурсов (картинки, шрифты и т.д.) при помощи as-файла и компилятора mxmlc, а не при помощи fla-файла. При компиляции swf, в него попадают не нужные мне классы из пакета mx.core. Есть ли какая то возможность сделать так, что бы они в библиотеку не попадали?

Образец класса библиотеки:
package {
import flash.display.Sprite;

public class Main extends Sprite
{
[Embed(source = '../bin/img1.png')] private static const Image1:Class;
[Embed(source = '../bin/img2.png')] private static const Image2:Class;
[Embed(source = '../bin/img3.png')] private static const Image3:Class;
[Embed(source = '../bin/img4.png')] private static const Image4:Class;

public function Main():void
{
}
}
}

f.g.programmer
12.04.2011, 20:35
Есть, но для каждого ресурса нужно создать отдельный класс, типа

package
{
import flash.display.Bitmap;

[Embed(source='../lib/image.png')]
public class image1 extends Bitmap
{
public function image1() {
super();
}
}

}

Aloran
13.04.2011, 00:06
что то данный код не компилится... пишет Error: A file found in a source-path 'Main' must have the same name as the class definition inside the file 'Img'.
Если же сделать так:
package {
import flash.display.Bitmap;
import flash.display.Sprite;

public class Main extends Sprite
{
[Embed(source='../lib/image.png')]
public class image1 extends Bitmap
{
public function image1() {
super();
}
}
public function Main()
{
}
}
}
то выдает Error: Classes must not be nested.

wvxvw
13.04.2011, 00:22
Пример f.g.programmer правильный, просто вы не правильно говорите компилятору, где находятся ваши файлы (либо вам нужно правильно указать classpath (параметр -cp) либо вы как-то не-так файл назвали.

Aloran
13.04.2011, 00:49
Все может быть и даже не может быть, а так и есть.
Как я делаю...
Создаю as3 проект во FlashDevelop и в классе Main "эмбедю" картинки (ПКМ по картинке -> Insert Into Document) и далее пишу как у f.g.programmer...
Если не жалко времени (аль еще чего) скиньте архивчик с тестовым проектиком. Может покопавшись в нем найду свою ошибку.

Кажется сам разобрался... я так понимаю что для каждой картинки надо создавать отдельный as-файл?

f.g.programmer
13.04.2011, 01:05
Да, чтобы мой пример работал, нужно поместить код в файл image1.as и разместить его в корневом пакете.
Генерировать такие классы можно автоматически.

Aloran
13.04.2011, 09:57
А подскажи, каким образом ты их так генерируешь?

f.g.programmer
13.04.2011, 20:40
Это можно делать практически на любом языке, принцип такой:
1. готовится минимальный шаблон, например

package { import flash.display.Bitmap; [Embed(source='(PATH)')] public class (NAME) extends Bitmap {} }

2. формируется список имя => путь с ресурсами, например
("image1" => "e:/image1.jpg", "image2" => "e:/image2.jpg")
3. генерируются as файлы подстановкой в шаблон имени и пути
4. генерируется ещё один класс, который импортирует все сформированные классы, и компилируется

Aloran
15.04.2011, 19:14
В итоге решили, что наличие классов из пакета mx.core, не критично и лучше обойтись без создания лишних файлов...
Но тут есть еще один недостаток: при компиляции к именам классов добавляет имя основного класса. Т.е. если смотреть на пример из первого поста, то в итоге, в либе, получаем классы Main_Image1, Main_Image и т.д. Как это побороть?

f.g.programmer
15.04.2011, 19:24
Скорее всего никак, но ничто не может помешать вам удалить лишние файлы после сборки библиотеки также автоматически.

Aloran
16.04.2011, 00:15
Дело в том что проект большой и поддерживается не один год... и библиотека компилируются периодически. А переводим из fla в as для удобства отслеживания изменений в git. Соответственно очень не хочется создавать лишнюю сотню классов.

wvxvw
16.04.2011, 00:50
Так они же будут создаваться только на время компиляции - соотвественно в репозитори не попадут.
Единственное, с чем может возникнуть проблема - портабельность билд скриптов. Писать генератор файлов на анте - можно, но это как-то не самый "правильный" инструмент для этого (кстати, кажется я где-то даже вшутку писал такой (http://www.flasher.ru/forum/showpost.php?p=977893&postcount=17)). Шелл-скрипты, ну в Виндовс будет проблема, либо, наоборот, будет собираться только в Виндовс. Как варианты можно использовать Пайтон, Перл, PHP и т.п. языки, потому что кроссплатформенные и просто устанавливаются - но то, что их нужно устанавливать может оказаться проблемой... еще вариант - написать на AS и сделать AIR програму, это просто, потому что все разработчики будут более-менее понимать, как использовать, но AIR уж очень избыточный для простой генерации файлов :) Кроме того, поставить AIR на 64-бит Линукс - это, прямо скажем, не для средних умов :)
Вобщем, смотрите по обстоятельствам, чем всей команде удобнее будет это сделать.

Aloran
16.04.2011, 14:50
Решил под AIR автоматизацию сделать... Что же касательно Установки AIR под 64-битную Ubuntu, особых проблем что то не припомню.

wvxvw
16.04.2011, 15:10
Ну, проблема уже хотя бы в том, что не существует AIR для 64-бит Линуксов, то, что есть - для 32-бит, и чтобы поставить его нужно дополнительно понаустанавливать дубликаты разных библиотек, но в 32-битном исполнении. Естесственно, установочных скриптов для AIR никто не написал, а в ридми - там ошибка на ошибке + устаревшие ссылки на Дебиан ППА, которые уже сто лет не работают. Ну и, соответсвенно, приходится нужные библиотеки устанавливать методом тыка - запустилось - ок, не запустилось - пробуем следующую...

Aloran
16.04.2011, 16:11
Я давно ставил, по какому то мануалу. И на все про все ушло минут 10 от силы... возможно не всем так повезло. К томуже я все таки надеюсь Adobe разродиться все же 64-bit версией AIR, рано или поздно.