Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   В браузере некорректно работает подгрузка изображений Loader (http://www.flasher.ru/forum/showthread.php?t=180199)

Svetlov 29.05.2012 21:09

В браузере некорректно работает подгрузка изображений Loader
 
Всем доброго дня.

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

TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/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. Если открыть в браузере по абсолютному пути все ок.

maxkar 29.05.2012 22:05

Цитата:

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

Svetlov 29.05.2012 22:41

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

Решил следующим образом -
1) Расширил класс Loader
Код AS3:

package  {
        import flash.display.Loader;
 
        /**
        * ...
        * @author Svetlov
        */

        public class Multiloader extends Loader {
 
                public var index:int;
 
                public function Multiloader() {
 
                }
 
        }
 
}

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

strangedk 29.05.2012 23:13

Цитата:

Сообщение от Svetlov (Сообщение 1082025)
Странно что это сказалось только при открытии через браузер.

А что странного. Браузер картинки грузит, а картинки разного размера.

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

Svetlov 30.05.2012 01:18

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

strangedk 30.05.2012 01:24

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

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

Wolsh 30.05.2012 01:39

Рассчитывать можно также на последовательную загрузку, если порядок появления тоже важен.

strangedk 30.05.2012 01:44

Цитата:

Сообщение от Wolsh (Сообщение 1082050)
Рассчитывать можно также на последовательную загрузку, если порядок появления тоже важен.

Цитата:

расчитывать нужно только на соответствующие обработчики событий.
Всё верно, пришел success или error, грузим следующее.


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

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