Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   readGraphicsData ошибается в конструкторе (http://www.flasher.ru/forum/showthread.php?t=209571)

samana 22.11.2014 17:30

readGraphicsData ошибается в конструкторе
 
Вложений: 1
Здравствуйте. Внезапно наткнулся на совершенно неожиданный момент, который затормозил мой проект и скоро добавит седых волос.
Идея была простая - вытащить из шейпа его растровую заливку (bitmapData) при помощи readGraphicsData. Но вдруг обнаружилось, что если это сделать из конструктора, то вылетает ошибка Error #2015: Invalid BitmapData как топор в спину. А если сделать это вне конструктора, то - всё работает.

Какова причина этой ошибки и как её избежать? Ведь мне необходимо проделывать эту операцию в конструкторе.
p.s. flashPlayer 14, -swf-version=25 прописано.

Набросал очень простой пример с этим багом(?), и если что, проект FD прикрепляю тоже.
Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.GraphicsBitmapFill;
        import flash.display.IGraphicsData;
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.utils.setTimeout;
 
        /**
        * ...
        * @author samana
        */

        public class Main extends Sprite
        {
                [Embed(source = "../images/flasher_logo_2013.png")]
                private var ImageClass:Class;
 
                private var _shape:Shape;
 
                public function Main():void
                {
                        //если вызвать в конструкторе то Error #2015: Invalid BitmapData.
                        stage_click();
 
 
                        //если вызвать после отработки конструктора, то всё хорошо
                        //stage.addEventListener(MouseEvent.CLICK, stage_click);
                        //setTimeout(stage_click, 1);
                }
 
 
                private function stage_click(e:MouseEvent=null):void
                {
                        // создаю шейп с растровой заливкой
                        _shape = new Shape();
                        _shape.graphics.beginBitmapFill((new ImageClass() as Bitmap).bitmapData);
                        _shape.graphics.drawRect(0, 0, 800, 300);
                        _shape.graphics.endFill();
 
                        addChild(_shape);
 
                        // пытаюсь вытянуть заливку из шейпа
                        var graphicsData:Vector.<IGraphicsData> = _shape.graphics.readGraphicsData();
                        trace(graphicsData);// [object GraphicsBitmapFill],[object GraphicsPath],[object GraphicsEndFill]
 
                        var fill:GraphicsBitmapFill = graphicsData[0] as GraphicsBitmapFill;
                        trace(fill);// [object GraphicsBitmapFill]
 
                        trace(fill.bitmapData);// [object BitmapData]
 
                        trace(fill.bitmapData.width); //[Fault] exception, information=ArgumentError: Error #2015: Invalid BitmapData.
                }
 
        }
 
}

Вложение 31274

silin 22.11.2014 18:39

да уж :(
и не только из конструктора, но и из следующего ENTER_FRAME
а с таймаутом ~50 мс уже работает - черная магия какая-то
похоже, что думать здесь надо уже не о том как заставить работать, а как обойти необходимость проделывать эту операцию именно в конструкторе

samana 22.11.2014 18:54

Цитата:

Сообщение от silin (Сообщение 1175335)
обойти необходимость проделывать эту операцию именно в конструкторе

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

cleptoman 23.11.2014 15:32

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

samana 23.11.2014 16:03

Да, но в моей ситуации это очень не удобно реализовывать.
Мне нужно было пробежаться по мувиклипу и собрать весь растр, который в нём есть. А так как если в мувиклип положить bitmap, то он превращает его в shape с заливкой.
На данный момент обошел ситуацию: каждой bitmap в библиотеке назначил класс для экспорта (хорошо что это можно сделать в пару кликов, а не вручную прописывать для каждой), и тогда bitmap уже не превращается в shape и я могу спокойно вытащить BitmapData.

Но всё равно хотелось бы узнать хоть причину коренной проблемы.


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

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