Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка 1119 Access of possibly undefined property bitmapData (http://www.flasher.ru/forum/showthread.php?t=174999)

Grays 07.02.2012 19:30

Ошибка 1119 Access of possibly undefined property bitmapData
 
Здравствуйте, уважаемые Флешеры. Помогите, пожалуйста, осознать, почему в данном коде происходит ошибка компиляции
Код:

C:\Documents and Settings\Администратор\Рабочий стол\Newtest2\RebegaMonster test\test\Test2.as, Line 33        1119: Access of possibly undefined property bitmapData through a reference with static type flash.display:DisplayObject.

Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.*;
    import flash.net.*;
            import flash.display.Bitmap;
                    import flash.display.BitmapData;
 
        public class Test2 extends MovieClip
        {
                var _loader:Loader = new Loader();
                var file:String = "Krab0001.png";
                var _request:URLRequest = new URLRequest(file);
 
 
                public function Test2()
                {
                        btn1.addEventListener(MouseEvent.CLICK,pngLoad);
                }
 
                public function pngLoad(event:MouseEvent)
                {
                        _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressListener);
                        _loader.addEventListener(Event.COMPLETE,displayPng);
                        _loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        _loader.load(_request);
                }
 
                public function displayPng(e:Event):void
                {
                        var bitmap:BitmapData=_loader.content.bitmapData;
                        var image:Bitmap = new Bitmap(bitmap);
                                addChild(image as Bitmap);
                        }
 
                public function progressListener(e:ProgressEvent):void
                {
                        trace("Loaded " + e.bytesLoaded + " of " + e.bytesTotal + " bytes.");
                }
 
                public function ioErrorHandler(event:IOErrorEvent):void
                {
                        trace("ioErrorHandler: " + event);
                }
        }
 
}

Воспринять текст ошибки по-русски я способен, но понять не получается.

В практически аналогичном коде из учебника всё работает:

Код AS3:

package {
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.net.URLRequest;
            import flash.display.Bitmap;
                    import flash.display.BitmapData;
 
    public class BitmapLoader extends Sprite {
        private var _loader:Loader = new Loader();
 
        public function BitmapLoader() {
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            _loader.load(new URLRequest("Krab0001.png"));
        }
 
        public function onComplete(event:Event):void {
        var image:Bitmap = Bitmap(_loader.content);
        var bitmap:BitmapData = image.bitmapData;
        addChild(image);
    }
 
 
    }
}


Bgg 07.02.2012 19:39

Код не аналогичный:

Код AS3:

var bitmap:BitmapData=_loader.content.bitmapData;
var image:Bitmap = new Bitmap(bitmap);

Код AS3:

var image:Bitmap = Bitmap(_loader.content);
var bitmap:BitmapData = image.bitmapData;

Свойство bitmapData есть только у класса Bitmap. С чего вы взяли что _loader.content - это экземпляр класса Bitmap?

toFL 07.02.2012 20:06

В качестве совета, лучше писать так:
Код AS3:

var image:Bitmap = _loader.content as Bitmap;


Grays 07.02.2012 20:28

О, спасибо, что надоумили! Действительно, это я упустил из виду. Добавил этот код по образу и подобию из другой программы, т.к. решил, что задачи (вроде бы) решались одинаковые. Но что-то упустил.
Но, если вам не трудно, ответьте, пожалуйста, если исправную версию кода использовать в первом варианте вот так:

Код AS3:

                public function pngLoad(event:MouseEvent)
                {
                        _loader.addEventListener(Event.COMPLETE,displayPng);
                        _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressListener);
                        _loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        _loader.load(_request);
}
                public function displayPng(e:Event):void
                {
                        var image:Bitmap = Bitmap(_loader.content);
                        var bitmap:BitmapData = image.bitmapData;
                        image.x = stage.stageWidth / 2;
                        image.y = stage.stageHeight / 2;
                        addChild(image);
    }

То при тестировании картинка в рабочей области не отображается, почему? Листая учебники, я этот момент всё время упускаю, не могу понять. Хотя если в функции pngLoad дописать строчку addChild(_loader);, то картинка на экране появится.

И ещё скажите, пожалуйста, если сделать в функции pngLoad цикл загрузки картинок по ссылкам из массива, то может возникнуть такая ситуация, что картинки не будут успевать загрузиться, так как флеш будет уже пытаться загрузить новые? Они же, если большие, то грузятся долго, а флеш, вроде, ходит по циклам с бешеной скоростью, верно? Или можно не переживать об этом?
Например, так:
Код AS3:

for (var i in ArrayBitmaps){
                        _loader.addEventListener(Event.COMPLETE,displayPng);
                        _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressListener);
                        _loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        _loader.load(ArrayBitmaps[i]);
                        resultArray.push(_loader);
}


toFL 08.02.2012 12:11

1) Что бы любой экранный объект стал видимым, его нужно добавить в область видимости. Как правило это делается так:
Код AS3:

this.addChild(myDisplayObject);

2) Загрузка нескольких изображений (и другой информации) решается двумя способами:
а) Грузить одним загрузчиком картинки по очереди
б) Создавать для каждого запроса новый загрузчик

Я бы использовал а)

Grays 08.02.2012 21:05

Цитата:

Сообщение от toFL (Сообщение 1061612)
2) Загрузка нескольких изображений (и другой информации) решается двумя способами:
а) Грузить одним загрузчиком картинки по очереди
б) Создавать для каждого запроса новый загрузчик

Можешь рассказать чуть поподробнее? Я в итоге пришел к такому коду:
(все переменные явным образом объявлены в классе)
Код AS3:

 
....
backPathsArray = calf(_named,_actio,"back");
....
public function calf(_named:String,_actio:String,_line:String):Array
        {
                var directionArray:Array = [];
                var loadedFileArray:Array = [];
// Это ассоциативный массив, в нём содержатся ссылки на файлы, которые необходимо загрузить.
                for (var i in SomebodyMonsters[_named][_actio][_line])
                {
                        _loader = new Loader();
                        _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                        _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
                        _loader.addEventListener(IOErrorEvent.IO_ERROR, onErrorHandlerIOErrorEvent);
                        _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onInfoIOErrorEvent);
                        try {
                        _loader.load(new URLRequest(SomebodyMonsters[_named][_actio][_line][i]));
                        } catch (e:TypeError)
                        {
                                trace("Не могу загрузить файл");
                                trace(e.message);
                        }

Далее, если здесь, скажем, использовать конструкцию
Код:

directionArray.push(_loader);
addChild(directionArray[0]);

то на экране отображается оная картинка, а в конечном массиве образуется множество [object Loader], но они мне не нужны, я хочу поместить все картинки в массив, из которого затем буду их использовать, поэтому пробую применять следующий код - первые 3 строчки ключевые.
Код AS3:

                        var image:Bitmap = _loader.content as Bitmap;
                        var bitmap:BitmapData = image.bitmapData;
                        directionArray.push(image);
                }
                loadedFileArray = directionArray;
 
                return loadedFileArray;
        }

Как результат, возвращаемый массив содержит сплошные null. Тоже самое происходит, если эти строчки заменить одной
Код:

directionArray.push(_loader.content);
Почему так происходит? В чём мои ошибки?
Мне в конечном итоге нужен какой-либо способ нормально взаимодействовать с загружаемыми картинками, как экземплярами Bitmap, но через массив.
Пожалуйста, помогите, не выходит разобраться.

P.S. Забыл добавить, что все события срабатывают нормально, (компилятор бывало ругался только на строчку var bitmap:BitmapData = image.bitmapData;). По событию прогресса видно, что картинки загружены.

toFL 09.02.2012 12:35

Вот самый простой пример последовательной загрузки:
Код AS3:

// один загрузчик на все картинки
var loader:Loader = new Loader();
// вешаем событие
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
 
// список нужных ресурсов
var list:Array = ["1.png", "2.png", "3.png"];
// номер загружаемой картинки
var i:uint;
// массив с полученными Bitmap-ами
var images:Array = [];
 
/** обработчик события успешной загрузки */
function onCompleteHandler (event:Event):void {
        images.push((event.target as LoaderInfo).loader.content as Bitmap);
        if (i < list.length) nextLoad();
        else trace("Все картинки загружены: ",images);
}
 
/** грузим следующую картинку */
function nextLoad ():void {
        loader.load(new URLRequest(list[i]));
        i++;
}
 
// начинаем загрузку
nextLoad();


Grays 09.02.2012 16:13

Ммм, что-то снова не так делаю.
Почему этот код может выдавать ошибку
SecurityError: Error #2000: Отсутствует активный контекст безопасности.
???


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

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