Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка #1009 или где искать "null"... (http://www.flasher.ru/forum/showthread.php?t=127370)

switcher! 12.07.2009 15:36

Ошибка #1009 или где искать "null"...
 
Добрый день!

Имею класс в отдельном AS-файле. Он должен брать из папки текстуру и размножать ее чтобы получить текстурированный участок карты, прикрепляясь к пустому мувиклипу для удобства перемещения:
Код AS3:

package utility
{
        import flash.display.MovieClip;
        import flash.display.Loader;
        import flash.net.URLRequest;
 
        public class ScreenMap extends MovieClip
        {
                var textureCell:Loader = new Loader();
                public var arrayMX:Array;
                public static var mapWidth:Number;
                public static var mapHeight:Number;
                public static var cellPixels:Number;
                public var map:MovieClip = new MovieClip();
 
                public function ScreenMap(numCellW, numCellH, cellPix)
                {
                        mapWidth = numCellW;
                        mapHeight = numCellH;
                        cellPixels = cellPix;
                        addChild(map);
                        textureCell.load(new URLRequest("pics/map_texture.jpg"));
                        trace ("есть");
 
                        for (var i:uint=0; i<mapHeight; i++)
                        {
                                trace ("есть");
                                arrayMX[i] = new Array();
                                trace ("есть");
 
                                for (var j:uint=0; j<mapWidth; j++);
                                {
                                        arrayMX[i][j] = textureCell;
                                        arrayMX[i][j].x = j*cellPixels;
                                        arrayMX[i][j].y = i*cellPixels;
                                        map.addChild(arrayMX[i][j]);
                                        trace ("есть");
                                }
                        }
                }
        }
}

при компиляции лезет ошибка:
Цитата:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at utility::ScreenMap()
at Base()
строк с ошибкой не казывается и вообще - ошибка выводится в output.
где он этот "null" берет никак не воткну...

первых два trace в output выводятся, а третий - нет. По логике ошибка должна быть здесь:
Код AS3:

trace ("есть");
arrayMX[i] = new Array();
trace ("есть"); // этот уже не выводится

но я не вижу в этом коде ошибки. Может кто-то более зрячий, чем я? :confused:

DeliMIter 12.07.2009 15:46

Объявление переменной типа "массив" не есть инициализация этой переменной. В этой строке arrayMX и есть искомый null. Чтобы ошибки не возникало, нужно до цикла инициализовать массив:
Код AS3:

arrayMX = new Array();


switcher! 12.07.2009 15:49

так я ж в самом начале ее инициализировал:
Код AS3:

public var arrayMX:Array;

тьфу, понял о чем речь. Спасибо! Код прошел - правда, текстура так и не отобразилась и ошибки нету... буду думать.

DeliMIter 12.07.2009 15:53

Это не инициализация. Это объявление.

Добавлено через 6 минут
Ну, там ещё логические ошибки разнообразные. Присвоение единственного экземпляра лодера элементам массива не размножает этот экземпляр. Т.е. ты внутри цикла всё время работаешь с одним и тем же объектом, соответственно единственный загруженный объект будет в правом нижнем углу.

switcher! 12.07.2009 16:10

так и есть!
Спасибище!!!!! я бы не скоро понял в чем проблема сам :yahoo: :drinks:
есть уже в голове немного другой алгоритм, где эта проблема будет исключена. :quiet:

Добавлено через 13 минут
таааак... а здесь уже сложнее:
Код AS3:

for (var i:uint=0; i<mapHeight; i++)
{
        arrayMX[i] = new Array();
 
for (var j:uint=0; j<mapWidth; j++);
{
        arrayMX[i][j] = new Loader();
        arrayMX[i][j].load(new URLRequest("pics/map_texture.jpg"));
        arrayMX[i][j].x = j*cellPixels;
        arrayMX[i][j].y = i*cellPixels;
        map.addChild(arrayMX[i][j]);
}
}

здесь в каждую ячейку массива заносится свой Лоадер, но в итоге получается только полоска из текстур по самому правому краю (т.е. вертикальная полоска). Не пойму - тут же не идет переприсвоение одного и того же экземпляра Лоадера. В чем бок ?

DeliMIter 12.07.2009 16:40

Ну, выглядит всё нормально. Совет по стилю: объяви локальную переменную типа Loader и работай с ней, т.е.

Код AS3:

var aLoader:Loader;
var aRequest:URLRequest;
 
// ...
 
aLoader = new Loader();
aLoader.x = ...;
aLoader.y = ...;
aLoader.load(aRequest);
 
aMap[i][j] = aLoader;

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

switcher! 12.07.2009 17:14

сделал.

не помогает ни так:
Код AS3:

                        for (var i:uint=0; i<mapHeight; i++)
                        {
                                arrayMX[i] = new Array();
 
                                for (var j:uint=0; j<mapWidth; j++);
                                {
                                        var tex:Loader = new Loader;
                                        var urlR:URLRequest = new URLRequest("pics/map_texture.jpg");
                                        tex.load(urlR);
                                        tex.x = j*cellPixels;
                                        tex.y = i*cellPixels;
 
                                        arrayMX[i][j] = tex;
                                        map.addChild(arrayMX[i][j]);
                                }
                        }

ни так:
Код AS3:

                        for (var i:uint=0; i<mapHeight; i++)
                        {
                                arrayMX[i] = new Array();
 
                                for (var j:uint=0; j<mapWidth; j++);
                                {
                                        getLoadTex();
                                        arrayMX[i][j] = tex;
                                        arrayMX[i][j].x = j*cellPixels;
                                        arrayMX[i][j].y = i*cellPixels;
                                        map.addChild(arrayMX[i][j]);
                                }
                        }
 
                function getLoadTex():Loader
                {
                        var tex:Loader = new Loader;
                        var urlR:URLRequest = new URLRequest("pics/map_texture.jpg");
                        tex.load(urlR);
                        return tex;
                }

более того, если потом прийтись еще одним циклом по уже обработанному массиву со значениями mapHeight=mapWidth=5 таким образом:
Код AS3:

                        for (var i:uint=0; i<mapHeight; i++)
                        {
                                for (var j:uint=0; j<mapWidth; j++);
                                {
                                        trace (arrayMX[i][j]);
                                }
                        }

trace выводит всего 5!!! значений [object Loader], тогда как должна выводить 5*5=25...
бред какой-то...

silin 12.07.2009 17:15

цикл пустой у тебя:
for (var j:uint=0; j<mapWidth; j++);
то что ты предполагаешь в цикле выполняется только один раз с последним значением итератора

switcher! 12.07.2009 17:18

что у нас для внимательности принимают ?:rolleyes:
мне срочно надо в аптеку :D

Всем спасибо!


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

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