Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.02.2012, 19:30
Grays вне форума Посмотреть профиль Отправить личное сообщение для Grays Найти все сообщения от Grays
  № 1  
Ответить с цитированием
Grays

Регистрация: Feb 2012
Сообщений: 5
Question Ошибка 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);
    }
 
 
    }
}


Последний раз редактировалось Grays; 07.02.2012 в 20:04. Причина: Очепятка
Старый 07.02.2012, 19:39
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 2  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Код не аналогичный:

Код 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?

Старый 07.02.2012, 20:06
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 3  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
В качестве совета, лучше писать так:
Код AS3:
var image:Bitmap = _loader.content as Bitmap;


Последний раз редактировалось toFL; 07.02.2012 в 20:22.
Старый 07.02.2012, 20:28
Grays вне форума Посмотреть профиль Отправить личное сообщение для Grays Найти все сообщения от Grays
  № 4  
Ответить с цитированием
Grays

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

Код 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);
}


Последний раз редактировалось Grays; 07.02.2012 в 20:54.
Старый 08.02.2012, 12:11
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 5  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
1) Что бы любой экранный объект стал видимым, его нужно добавить в область видимости. Как правило это делается так:
Код AS3:
this.addChild(myDisplayObject);
2) Загрузка нескольких изображений (и другой информации) решается двумя способами:
а) Грузить одним загрузчиком картинки по очереди
б) Создавать для каждого запроса новый загрузчик

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

Старый 08.02.2012, 21:05
Grays вне форума Посмотреть профиль Отправить личное сообщение для Grays Найти все сообщения от Grays
  № 6  
Ответить с цитированием
Grays

Регистрация: Feb 2012
Сообщений: 5
Цитата:
Сообщение от toFL Посмотреть сообщение
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. По событию прогресса видно, что картинки загружены.


Последний раз редактировалось Grays; 08.02.2012 в 21:07.
Старый 09.02.2012, 12:35
toFL вне форума Посмотреть профиль Найти все сообщения от toFL
  № 7  
Ответить с цитированием
toFL
Banned

Регистрация: May 2011
Адрес: +48° 27' 57.93", +35° 2' 46.02"
Сообщений: 447
Записей в блоге: 2
Отправить сообщение для toFL с помощью Skype™
Вот самый простой пример последовательной загрузки:
Код 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();

Старый 09.02.2012, 16:13
Grays вне форума Посмотреть профиль Отправить личное сообщение для Grays Найти все сообщения от Grays
  № 8  
Ответить с цитированием
Grays

Регистрация: Feb 2012
Сообщений: 5
Ммм, что-то снова не так делаю.
Почему этот код может выдавать ошибку
SecurityError: Error #2000: Отсутствует активный контекст безопасности.
???

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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