Ответ 1
вместо
var test:Bitmap = new Resource.SHIPS_1();
Использование
myImage.source = Resource.SHIPS_1;
Вложение верно.: D, как вы его используете, неверно:)
Адриан
Я создаю игру, в которой много изображений используется в ActionScript/Flex 3 (Flash). Теперь, когда я достиг стадии дизайнера, мне нужно разработать структурный способ использования встроенных изображений (которые нужно манипулировать с помощью поворота, цвета и т.д.).
К сожалению, после изучения немного, похоже, что вы должны вручную вставлять изображения, прежде чем сможете их использовать. В настоящее время у меня есть настройка следующим образом:
Файл класса Resource.as:
package
{
public final class Resource
{
[Embed (source="/assets/ships/1.gif" )]
public static const SHIPS_1:Class;
}
}
Итак, только для одного корабля я так должен:
Поместите изображение в нужную папку с правильным именем Назовите его таким же образом в файле Resource.as Создайте константу с тем же именем в файле Resource.as
Даже если это все возможно, просто поместив файл в указанную папку.
Чтобы еще хуже, мне все равно придется называть его, используя:
var test:Bitmap = new Resource.SHIPS_1();
Должны быть лучшие способы обработки ресурсов при создании очень больших приложений? Представьте, что мне нужны тысячи изображений, эта система просто не подходит.
вместо
var test:Bitmap = new Resource.SHIPS_1();
Использование
myImage.source = Resource.SHIPS_1;
Вложение верно.: D, как вы его используете, неверно:)
Адриан
Если вам нужно обрабатывать большое количество ресурсов, вы можете выполнить следующие три шага:
Поместите их в несжатый zip-архив
Вставьте zip файл в виде двоичных данных:
[Вставить (source = 'resources.zip', mimeType = 'application/octet-stream')]
Доступ к ресурсам с помощью FZip
Если вы выбираете другой метод, который включает загрузку внешних файлов, имейте в виду, что некоторые веб-сайты флеш-игр требуют, чтобы игры, которые они размещают, содержались в одном SWF файле.
Это действительно то, что для Flash CS4. Твой путь мне кажется хорошим, хотя, хотя я бы не использовал все кепки для имени класса, даже если он является константой. Просто опустите голову и получите копию!
В качестве альтернативы вы можете загружать файлы во время выполнения.
Это старый, но, поскольку я наткнулся на него, ища что-то другое, я напишу здесь для будущих поколений:)
Я использую другой подход. Я создаю swf-фильм с профессионалом flash и импортирую в него всю графику, а затем помечаю их все для "Export for ActionScript". Скомпилируйте swf, и в вашем основном проекте встройте только swf и получите доступ ко всей графике...
Я нахожу этот подход гораздо более организованным. Зачем писать весь класс ресурсов, когда вы можете сделать это, импортировав файлы правильно?;)
Я просто смотрел этот отличный учебник по структуре Starling: http://www.hsharma.com/tutorials/starting-with-starling-ep-3-sprite-sheets/
Похоже, что спрайты - это именно то, что вы ищете: Вы объединяете все свои отдельные текстуры в одну большую текстуру, которая называется spritesheet, и создайте xml файл, содержащий информацию, где текстуры находятся в пределах спрайта. Для этого вы можете использовать этот инструмент: http://www.codeandweb.com/texturepacker
Я не уверен, что вы можете использовать его для коммерческих проектов, и количество текстур, о которых вы говорите, не похоже на то, что вы делаете это как хобби, поэтому вы можете проверить лицензию. Там также доступна версия pro.
Texturepacker создает два файла: spritesheet.png и spritesheet.xml. Вы просто скопируете их в свой проект. Затем вы добавляете этот код в один из ваших классов.
private static var gameTextureAtlas:TextureAtlas;
[Embed(source="../media/graphics/mySpriteSheet.png")]
public static const AtlasTextureGame:Class;
[Embed(source="../media/graphics/mySpritesheet.xml", mimeType="application/octet-stream")]
public static const AtlasXmlGame:Class;
public static function getAtlas():TextureAtlas
{
if(gameTextureAtlas==null)
{
var texture:Texture=getTexture("AtlasTextureGame");
var xml:XML=XML(new AtlasXmlGame());
gameTextureAtlas=new TextureAtlas(texture,xml);
}
return gameTextureAtlas;
}
Теперь вы можете получить доступ ко всем текстурам спрайта, вызвав
YourClass.getAtlas().getTexture("name");
Это просто потрясающе. Когда вы используете texturepacker, имя файла каждого из спрайтов, которое вы вложили в спрайт, становится его текстовым именем.
Возможно, это слишком поздно, чтобы помочь вам, но я надеюсь, что будущие посетители могут извлечь выгоду из этого элегантного решения.
Я хотел бы подчеркнуть, что этот ответ в основном является выдержкой из учебника по шарме. Я даже чувствовал себя свободно, чтобы воспроизвести код, который он использовал в своем скринкасте. Все его заслуги
Это зависит от того, насколько велики ваши индивидуальные образы, но вы можете поместить их на одном изображении, как спрайт. Если вы хотите нарисовать конкретный корабль, используйте правильное смещение xy в изображении для этого корабля и используйте copyPixels, чтобы нарисовать его в вашем растровом изображении.
package
{
public final class Resource
{
[Embed (source="/assets/ships/1.gif" )]
public static const SHIPS_1:Class;
}
}
[Embed (source="/assets/ships/1.gif" )]
public static const SHIPS_1:Class;
Мне нравится делать мои классы в библиотеке таким образом.
Я взял код GSkinners для синглтона: http://gskinner.com/blog/archives/2006/07/as3_singletons.html
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
public class Lib
{
/*
Make this an Singleton, so you only load all the images only Once
*/
private static var instance:Lib;
public static function getInstance():Lib {
if (instance == null) {
instance = new Lib(new SingletonBlocker());
}
return instance;
}
public function Lib(p_key:SingletonBlocker):void {
// this shouldn't be necessary unless they fake out the compiler:
if (p_key == null) {
throw new Error("Error: Instantiation failed: Use Singleton.getInstance() instead of new.");
}
}
/*
The actual embedding
*/
[Embed(source="assets/images/someImage.png")]
private var ImageClass:Class;
private var _imageClass:Bitmap = new ImageClass() as Bitmap;
[Embed(source="assets/images/someOtherImage.png")]
private var OtherImageClass:Class;
private var _otherImageClass:Bitmap = new ImageClass() as Bitmap;
public function get imgClass():Bitmap{
return _imageClass;
}
public function get imgClassData():BitmapData{
return _imageClass.BitmapData;
}
public function get otherImageClass():Bitmap{
return _otherImageClass;
}
public function get otherImageClassData():BitmapData{
return _otherImageClass.BitmapData;
}
}
}
internal class SingletonBlocker {}
[Вставить (источник = "/assets/images/123.png))] public static const className: Class;
Хорошая идея, lhk
Это хорошее решение, такое как Source-Engine с vtf и vmt vtf = изображение vmt = script (например, xml или javascript)
Хорошо, я хотел бы предложить для TexturePacker, TexturePath или TextureTarget: P
Спасибо за подсказку.
Например: mytexture.js:
xml или javascript:
function mytexture() {basedir = "/assets/mytexture.png", normalmap = "/assets/mytexture_bump.png", normalcube) [1, 1, 1]};
Я не думаю, потому что текстура по умолчанию получает ошибку где-то mytexture.png не существует, чем это происходит снова:)
[Вставить (source = "../assets/editors/error_texture.png" )] public static const ERROR_TEX: класс;...
Как я знаю, потому что ActionScript 3 должен "читать" на javascript, например jsBirdge или ExternalInterface.call();
Возможно ли это?
гораздо лучший подход http://itfailed.blogspot.com/2011/02/howt-o-embed-images-in-actionscript-3.html