Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Загрузка изображения в объект (http://www.flasher.ru/forum/showthread.php?t=160677)

1q2w3e4r5t6 15.07.2011 22:36

Загрузка изображения в объект
 
Привет!
Не получается загрузить картинку PNG в программу:
Код AS3:

package Game
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Loader;
        import flash.display.SimpleButton;
        import flash.display.Sprite;
        import flash.net.URLRequest;
 
        public class Button extends Sprite
        {
                private var upState:Bitmap, downState:Sprite, overState:Sprite, loader:Loader, qwe:Bitmap;
                public function Button(x:int, y:int)
                {
                        super();
                        loader = new Loader();
                        loader.load(new URLRequest("images\\nextLevel.png"));
                        upState = loader.content as Bitmap;
                        this.x=x; this.y=y;
                        this.addChild(upState);
                }
        }
}

Изображение находится по адресу: D:\Documents\Adobe Flash Builder 4.5\Game1\src\images\nextLevel.png. В справке сказано, что можно использовать относительный путь, правильно его записал?

PS Уже после финальной компиляции, эта картинка будет находится в самом SWF файле приложения?

КорДум 15.07.2011 22:37

Слеш не в ту сторону.

Добавлено через 2 минуты
Цитата:

PS Уже после финальной компиляции, эта картинка будет находится в самом SWF файле приложения?
Нет. Используйте Embed.

Universe 15.07.2011 22:46

да и два слеша лучше не ставить!

КорДум 15.07.2011 22:48

Цитата:

Сообщение от Universe (Сообщение 1011965)
да и два слеша лучше не ставить!

Почему?

goodguy 15.07.2011 22:48

Да и вот тут ошибка:
Цитата:

Код AS3:

loader = new Loader();
loader.load(new URLRequest("images\\nextLevel.png"));
upState = loader.content as Bitmap;


В этот момент контент еще не создан. Он будет null.
К объекту contentLoaderInfo загрузчика нужно добавить слушатель Event.COMPLETE и только после его срабатывания получаеть свойство content
Цитата:

да и два слеша лучше не ставить!
Это экранирование вообще-то. Как раз таких слешей надо 2, чтобы в итоге остался один. Но здесь, как уже сказал КорДум, нужен передний слеш

1q2w3e4r5t6, в чем прикол вызывать super() если в него не передается никаких параметров? Плеер его и так вызовет, автоматически.
п.с. Так же не понимаю, зачем везде ставить this, и при этом не отделять пробелами ни один оператор

1q2w3e4r5t6 15.07.2011 23:22

Flash Builder его автоматически создает, ни и фиг с ним))
Код AS3:

public class Button extends Sprite
        {
                private var upState:Bitmap, downState:Sprite, overState:Sprite, loader:Loader;
                public function Button(x:int, y:int, text:String)
                {
                        super();
                        loader = new Loader();
                        loader.load(new URLRequest("images//nextLevel.png"));
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeEventListener);
                        this.x=x; this.y=y;
                }
 
                private function completeEventListener(e:LoaderEvent):void
                {
                        upState = loader.content as Bitmap;
                        this.addChild(upState);
                }
        }

Выдает ошибку: TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@2d54539 to org.osmf.events.LoaderEvent.

PS И что такое Embed?

t4arty 15.07.2011 23:36

Исправте: e:LoaderEvent на e:Event

1q2w3e4r5t6 15.07.2011 23:52

Ура! Получилось!
А что за Embed?

КорДум 16.07.2011 00:17

http://livedocs.adobe.com/flex/3/htm...etadata_3.html

1q2w3e4r5t6 16.07.2011 13:23

Спасибо, получилось с этой штукой загрузить PNG. А получается только одно изображение можно встраивать в переменную с типом Class?

КорДум 16.07.2011 13:37

Конечно, а как иначе?

1q2w3e4r5t6 16.07.2011 17:58

Эх... Просто в приложении хочу сделать свои кнопки, а поэтому в него нужно запихнуть не менее 30ти картинок. Т.е. получается нужно написать это:
Код AS3:

[Embed(source="images//pic_№K.png", mimeType="image/png")]
private var imgCls_K:Class;

тридцать раз?
А нельзя как-нибудь создать файл с ресурсами (отдельный),вписать в него команды Embed, вложить его в папку и когда нужно, ссылаться на него при вставки изображения, например, через Loader(или еще как-то)?

КорДум 16.07.2011 18:16

Ну вынесите это в отдельный класс Assets. Сделайте статикой геттеры классов или просто публичными переменными. Embed вкомпиливает ресурсы, Loader - выкачивает из сети.

1q2w3e4r5t6 16.07.2011 18:40

Ладно, посмотрим. А подскажите, что за команда sourceList такая?

КорДум 16.07.2011 18:44

Где это?

1q2w3e4r5t6 16.07.2011 18:47

Код AS3:

[Embed(sourceList="sourceList" , mimeType="image/png")]

Добавлено через 3 минуты
О ужос! Embed не определяется, если его записать в теле цикла, расположенного на уровне класса! Хм, а если требуется вставить 100 картинок, это что получается - в ручную прописывать для каждой картинки свой Embed и свою переменную с типой Class, т.е. писать 200 строк? Как-то оно не рационально...

in4core 16.07.2011 19:59

Цитата:

О ужос! Embed не определяется, если его записать в теле цикла, расположенного на уровне класса! Хм, а если требуется вставить 100 картинок, это что получается - в ручную прописывать для каждой картинки свой Embed и свою переменную с типой Class, т.е. писать 200 строк? Как-то оно не рационально...
Скока живу ни разу не видел, чтобы требовалось запостить сразу 200 картинок для эмбед. Когда уж через чур много графики, используем F IDE , куда деваться то :)

1q2w3e4r5t6 16.07.2011 20:08

Хм, ну например в главном меню 5 кнопок, в менюшке для перехода на след. уровень - еще 4 кнопки, в менюшке для выбора уровня - еще 2 кнопки. У каждой кнопки три состояния (нажато, отжато, наведено). Итого: (5+4+2)*3=33 картинки.

in4core 16.07.2011 20:13

Shape рулит. Почти 90% кнопок делаются шейпами. Все остальные изыски редки, но уж в этом случае придется 33 добавить))

КорДум 16.07.2011 20:21

Кто мешает добавить все 33 ассета в класс с ассетами? Если так лень, что жить не хочется, то используйте FlashIDE -> SWC. Или вроде как скриптами компиляции-антами народ внедряет тонны картинок через Embed. Где-то слышал про это, но вживую не видел сие чудо.

1q2w3e4r5t6 16.07.2011 22:34

Я пока шейпами плохо владею, поэтому кнопки рисую в Photoshop, а текст через Label вставлять буду.))

in4core 17.07.2011 01:02

Вот это заведомо неверный подход. Label вообще нафиг не нужон, изучите ТекстФилд и сделайте свой кастомный быстрый класс для добавления филдов. А уж про шейп вообще молчу, обязан знать каждый!

Всего то пара строчек

Код AS3:

package com.in4core.text 
{
        import flash.text.TextField;
        import flash.text.TextFormat;
        /**
        * ...
        * @author in4core
        */

        public class DisplayText extends Object
        {
                private static var _textfield:TextField;
 
 
                public static function addField ( font:String = null , size:uint = 12, bitmapFonts:Boolean = false,
 
                autosize:String = 'left', isMulti:Boolean = false, text:String = '' ) : TextField
 
                {
                        _textfield = null;
 
                        _textfield = new TextField();
 
                        _textfield.defaultTextFormat = setFormat(size, font);
 
                        _textfield.autoSize = autosize;
 
                        _textfield.text = text;
 
                        if (isMulti) _textfield.multiline = true;
 
                        _textfield.selectable = false;
 
                        if (!bitmapFonts) _textfield.antiAliasType = 'advanced';
 
                        if (font != null) _textfield.embedFonts = true;
                        else font = '_sans';
 
                        return _textfield;
                }
 
                private static function setFormat( size:uint, font:String ):TextFormat {
 
                        var tf:TextFormat = new TextFormat();
 
                        tf.size = size;
 
                        tf.font = font;
 
                        return tf;
                }
 
        }
 
}

Код AS3:

var field:TextField = DisplayText.addField('font1', 20);

и пляшем.

1q2w3e4r5t6 17.07.2011 01:15

Я сперва так и делал - текст вставлял через поля. Единственное, не получилось свой шрифт вставить и при наведении на текст в окне приложения - появлялся курсор для редактирования. Т.е. какой-то командой нужно запретить считать этот текст выделяемым.

Ну а лабел - он вроде для этого и сделан). Ну по крайней мере в Qt класс QLabel сделан для этого.

КорДум 17.07.2011 01:30

Здесь не Qt. Свой шрифт делается через TextField#embedText и TextField#defaultTextFormat (еще есть TextField#setTextFormat).

Добавлено через 6 минут
И не мешало бы документацию почитать, что есть у TextField и для чего оно. Label - оболочка для TextField. На мой взгляд, самая бесполезная, ибо все, что она делает, описывается, буквально парой строчек обычного текстового поля.


Часовой пояс GMT +4, время: 08:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.