Как правильно вставлять изображения в Actionscript 3/Flex 3?

Я создаю игру, в которой используется много изображений в Actionscript / Flex 3 (Flash). Теперь, когда я достиг стадии дизайнера, я должен разработать структурный способ использования встроенных изображений (которыми нужно манипулировать с помощью вращения, цвета и т. д.).

к сожалению, после исследования немного, похоже, что вам нужно вручную вставлять изображения, прежде чем вы сможете их использовать. В настоящее время у меня есть такая настройка:

ресурс.как класс файл:

package
{
    public final class Resource
    {
        [Embed (source="/assets/ships/1.gif" )]
        public static const SHIPS_1:Class;
    }
}

Итак, всего за один корабль я так за должен:

поместите изображение в правильную папку с правильным именем Назовите его таким же образом в ресурсе.как файл Создайте константу с тем же именем в ресурсе.как файл

хотя все это должно быть возможно, просто поместив файл в указанную папку.

чтобы сделать вещи еще хуже, я еще это назвать использование:

var test:Bitmap = new Resource.SHIPS_1();

там должны быть лучшие способы обработки ресурсов при создании очень больших программ? Представьте, что мне нужны тысячи изображений, эта система просто не подходит.

12 ответов


вместо

var test:Bitmap = new Resource.SHIPS_1();

использовать

myImage.source = Resource.SHIPS_1;

вложение является правильным. :D и как вы используете это неправильно :)

Эдриан


Если вам нужно обработать большое количество ресурсов, вы можете выполните следующие 3 шага:

  1. поместите их в несжатый zip-архив

  2. вставьте zip-файл в двоичные данные:

    [Embed(source = ' ресурсы.zip', mimeType = 'application / octet-stream')]

  3. доступ к ресурсам с помощью FZip

Если вы выберите другой метод, который включает в себя загрузку внешние файлы помните, что некоторые сайты требуют флеш игры игры Для в один SWF-файл.


Это действительно то, что Flash CS4 для. Ваш путь кажется мне прекрасным, хотя-хотя я бы не использовал все шапки для имени класса, даже если это константа. Просто опусти голову и сделай копию!

в качестве альтернативы вы можете загрузить файлы во время выполнения.


Это старый, но так как я наткнулся на него в поисках чего-то другого, я напишу здесь для будущих поколений : )

Я использую другой подход. Я создаю swf-фильм с flash professional и импортирую в него всю графику, а затем помечаю их для "экспорт для ActionScript". Скомпилируйте swf и в свой основной проект встраивайте только swf и получите доступ ко всей графике через него...

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


Я только что смотрел этот отличный учебник по структуре Starling: http://www.hsharma.com/tutorials/starting-with-starling-ep-3-sprite-sheets/

похоже, что spritesheets-это именно то, что вы ищете: Вы связываете все ваши отдельные текстуры в одну большую текстуру, которая называется spritesheet и создать xml-файл, содержащий информацию, где текстуры находятся в spritesheet. Для этого вы можете использовать это инструмент: 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;
    }

теперь вы можете получить доступ ко всем текстурам spritesheet, вызвав

YourClass.getAtlas().getTexture("name");

Это просто офигенно. Когда вы используете texturepacker имени каждого из спрайтов вы комплекте в spritesheet становится его texturename.

это, вероятно, слишком поздно, чтобы помочь вам, но я надеюсь, что будущие посетители могут извлечь выгоду из этого элегантного решения.

Я хотел бы подчеркнуть, что этот ответ является по сути выпиской из учебник шармы. Я даже смог воспроизвести код, который он использовал в своем показе. Все заслуги принадлежат ему!--5-->


Это зависит от того, насколько велики ваши отдельные изображения, но вы можете поместить их все в одно изображение, как spritesheet. Если вы хотите нарисовать конкретный корабль, используйте правильное смещение 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 {}

[Embed (source="/активы/изображения/123.формат PNG" )] public static const className: Class;


хорошая идея, lhk

Это хорошее решение, такое как Source-Engine с vtf и vmt vtf = изображение vmt = скрипт (например, xml или javascript )

хорошо я хотел бы предложить для TexturePacker, TexturePath или TextureTarget: P

спасибо ou за подсказку.

например: mytexture.js:

xml или javascript:

функция mytexture () { basedir = " /assets / mytexture.png", normalmap = "/активы/mytexture_bump.формат PNG", normalcube ) [ 1, 1, 1 ] };

Я не думаю, потому что текстура по умолчанию получает ошибку где-то mytexture.png не существует, чем это происходит снова :)

[Embed(source="../ активы / Редакторы / error_texture.формат PNG")] общественная статический const ERROR_TEX: Class; ...

Как узнать, потому что Actionscript 3 должен "читать" на javascript, например jsBirdge или ExternalInterface.call();

возможно ли это?