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

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

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

Регистрация: May 2012
Сообщений: 8
По умолчанию В браузере некорректно работает подгрузка изображений Loader

Всем доброго дня.

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

TypeError: Error #2007: Parameter child must be non-null.
at flash.display:isplayObjectContainer/addChild()
at Function/<anonymous>()[C:\wamp\www\chess\DataLoader.as:74]

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

Код AS3:
package  
{
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.media.Sound;
	import flash.net.URLRequest;
 
	/**
	 * ...
	 * @author Svetlov
	 */
	public class DataLoader
	{
 
		public function DataLoader(gameBody:Function) {
 
			// Loading board
			var addBoard:Function = function(e:Event):void {
				GVC.board = ld.content as Bitmap;
			}
			var ld:Loader;
			ld = new Loader();
			ld.contentLoaderInfo.addEventListener(Event.COMPLETE, addBoard);
			ld.load(new URLRequest('media/images/chessgame/chessboard.png'));
 
			// Loading figures
			var loadWhites:Function = function():void {
				gameBody.call();
			}
			var loadBlacks:Function = function():void {
				loadFigures('white', loadWhites);
			}
			loadFigures('black', loadBlacks);
 
			// Loading sounds
			loadSounds();
 
		}
 
		/**
		 * Loading figures images from disk
		 * @param	color - color of the figures
		 * @param	cb - callback function
		 */
		public function loadFigures(color:String, cb:Function):void {
 
			var i:int;
			var f_names:Array;
			if(color == 'white'){
				f_names = new Array('rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight', 'rook');
			}else {
				f_names = new Array('rook', 'knight', 'bishop', 'queen', 'king', 'bishop', 'knight', 'rook');
			}
			var bitmapImages:Array = new Array();
			for (i = 0; i < 8; i++) {
				f_names.push('pawn');
			}
			var figures:Array = new Array();
			for (i = 0; i < f_names.length; i++) {
				figures[i] = new Figure();
				figures[i].name = f_names[i];
				figures[i].this_color = color;
			}
			var ldrs:Array = new Array();
 
			for (i = 0; i < f_names.length; i++) {
				ldrs.push(new Loader);
			}
 
			var calb:Function = function(e:Event):void {
				bitmapImages.push(ldrs[bitmapImages.length].content as Bitmap);
				figures[bitmapImages.length-1].addChild( bitmapImages[bitmapImages.length - 1]);
 
				if (bitmapImages.length == f_names.length) {
					if (color == 'white') {
						GVC.bitmapWhites = bitmapImages;
						GVC.whites = figures;
					}
					if (color == 'black') {
						GVC.bitmapBlacks = bitmapImages;
						GVC.blacks = figures;
					}
					cb.call();
				}
			}
 
			for (i = 0; i < f_names.length; i++) {
				ldrs[i].contentLoaderInfo.addEventListener(Event.COMPLETE, calb);
				trace('media/images/chessgame/' + color + '/' + f_names[i] + '.png');
				ldrs[i].load(new URLRequest('media/images/chessgame/'+color+'/'+f_names[i]+'.png'));
			}
		}
 
		public function loadSounds():void {
			GVC.right_sound = new Sound(new URLRequest('media/sounds/chessgame/knock.mp3'));
			GVC.wrong_sound = new Sound(new URLRequest('media/sounds/chessgame/wrong.mp3'));
		}
 
	}
 
}
Пробовал трейсить через flashFireBug, получается что грузятся черные до короля, на втором слоне (bishop) вываливается указанная выше ошибка. Помогите разобраться пожалуйста. Даже предположить не могу в чем может быть проблема.

UPD:
Забыл сказать что открываю с тестового сервера по url. Если открыть в браузере по абсолютному пути все ок.


Последний раз редактировалось Svetlov; 29.05.2012 в 21:44.
Старый 29.05.2012, 22:05
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
bitmapImages.push(ldrs[bitmapImages.length].content as Bitmap);
А почему вы решили, что загрузка картинок будет заканчиваться в том порядке, в котором она начиналась? Вполне может быть так, что первой загрузится картинка 5-го лоадера в массиве. А у первого content все еще будет null.
Вторая возможная причина - неверный url. Вы же ошибки не обрабатываете, поэтому произойдет "пропуск" лоадеров.

Старый 29.05.2012, 22:41
Svetlov вне форума Посмотреть профиль Отправить личное сообщение для Svetlov Найти все сообщения от Svetlov
  № 3  
Ответить с цитированием
Svetlov

Регистрация: May 2012
Сообщений: 8
Спасибо. Ваше первое предположение по поводу причины ошибки оказалось верным. Действительно лоаер под индексом идущим по порядку может быть вовсе не тем. Странно что это сказалось только при открытии через браузер.

Решил следующим образом -
1) Расширил класс Loader
Код AS3:
package  {
	import flash.display.Loader;
 
	/**
	 * ...
	 * @author Svetlov
	 */
	public class Multiloader extends Loader {
 
		public var index:int;
 
		public function Multiloader() {
 
		}
 
	}
 
}
Ну и в коде сделал соответсвующие правки, вместо индксов по порядку взял индекс объекта лоадера передаваемого в объекте события.

Старый 29.05.2012, 23:13
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 4  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Цитата:
Сообщение от Svetlov Посмотреть сообщение
Странно что это сказалось только при открытии через браузер.
А что странного. Браузер картинки грузит, а картинки разного размера.

Локально в большинстве случаев всё происходит мгновенно.
__________________
adobe AS3 manual

Старый 30.05.2012, 01:18
Svetlov вне форума Посмотреть профиль Отправить личное сообщение для Svetlov Найти все сообщения от Svetlov
  № 5  
Ответить с цитированием
Svetlov

Регистрация: May 2012
Сообщений: 8
strangedk
Ну вообще картинки одинаковые, это же фигуры) Все 75\75 пикселей. Но суть думаю я понял, при открытии через урл, браузер подгружает картинки иначе чем при открытии через абсолютный путь, в этом случае скорее всего он вообще ничего не грузит, а оставляет это флешу. Хотя мне казалось что флеш менее браузернозависимая среда...

Старый 30.05.2012, 01:24
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 6  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
в любом случае нужно понимать, что любой процесс загрузки может завершиться с разным результатом, и конечно же асинхронно.

Поэтому расчитывать нужно только на соответствующие обработчики событий.
__________________
adobe AS3 manual

Старый 30.05.2012, 01:39
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Рассчитывать можно также на последовательную загрузку, если порядок появления тоже важен.
__________________
Reality.getBounds(this);

Старый 30.05.2012, 01:44
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 8  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Рассчитывать можно также на последовательную загрузку, если порядок появления тоже важен.
Цитата:
расчитывать нужно только на соответствующие обработчики событий.
Всё верно, пришел success или error, грузим следующее.
__________________
adobe AS3 manual

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

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

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


 


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


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