Как правильно вставлять изображения в Actionscript 3 / Flex 3? - PullRequest
13 голосов
/ 28 июня 2009

Я создаю игру, в которой много изображений используется в 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();

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

Ответы [ 12 ]

16 голосов
/ 29 июня 2009

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

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

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

    [Embed (source = 'resources.zip', mimeType = 'application / octet-stream')]

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

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

6 голосов
/ 28 июня 2009

вместо

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

Используйте

myImage.source = Resource.SHIPS_1;

Вложение правильно. : D то, как вы используете это неправильно :) 1007 *

Адриан

5 голосов
/ 28 июня 2009

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

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

2 голосов
/ 13 октября 2012

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

Звучит так, будто спрайт-листы именно то, что вы ищете: Вы объединяете все свои отдельные текстуры в одну большую текстуру, которая называется spritesheet, и создаете xml-файл, который содержит информацию о том, где текстуры находятся внутри spritesheet. Для этого вы можете использовать этот инструмент: http://www.codeandweb.com/texturepacker

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

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, имя каждого из спрайтов, включенных в spritesheet, становится его именем текстуры.

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

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

2 голосов
/ 19 октября 2011

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

Я использую другой подход. Я создаю SWF-фильм с помощью Flash Professional и импортирую всю графику, а затем отмечаю их как «Экспорт для ActionScript». Скомпилируйте SWF и в ваш основной проект вставьте только SWF и получите доступ ко всей графике через него ...

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

1 голос
/ 20 февраля 2012
package
{
    public final class Resource
    {
        [Embed (source="/assets/ships/1.gif" )]
        public static const SHIPS_1:Class;
    }
}
1 голос
/ 11 июня 2011

Зависит от того, насколько велики ваши индивидуальные изображения, но вы можете поместить их все в одно изображение, например, в таблицу спрайтов. Если вы хотите нарисовать конкретный корабль, используйте правильное смещение xy на изображении для этого корабля и используйте copyPixels, чтобы нарисовать его в своем растровом изображении.

0 голосов
/ 21 ноября 2012

Хорошая идея, лхк

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

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

Спасибо за совет.

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

xml или javascript:

function mytexture () {basedir = "/assets/mytexture.png", normalmap = "/assets/mytexture_bump.png", обычный куб) [1, 1, 1]};

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

[Embed (source = "../ assets / editors / error_texture.png")] public static const ERROR_TEX: Class; ...

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

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

0 голосов
/ 02 апреля 2012

[Embed (source = "/ assets / images / 123.png")] public static const className: Class;

0 голосов
/ 29 марта 2012

Мне нравится делать мои классы Библиотеки как это.

Я взял код 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 {}
...