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

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

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

Регистрация: May 2009
Сообщений: 220
Checked Ошибка #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 ("есть"); // этот уже не выводится
но я не вижу в этом коде ошибки. Может кто-то более зрячий, чем я?

Старый 12.07.2009, 15:46
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 2  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Объявление переменной типа "массив" не есть инициализация этой переменной. В этой строке arrayMX и есть искомый null. Чтобы ошибки не возникало, нужно до цикла инициализовать массив:
Код AS3:
arrayMX = new Array();
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 12.07.2009, 15:49
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 3  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
так я ж в самом начале ее инициализировал:
Код AS3:
public var arrayMX:Array;
тьфу, понял о чем речь. Спасибо! Код прошел - правда, текстура так и не отобразилась и ошибки нету... буду думать.


Последний раз редактировалось switcher!; 12.07.2009 в 15:58.
Старый 12.07.2009, 15:53
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 4  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Это не инициализация. Это объявление.

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

Старый 12.07.2009, 16:10
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 5  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
так и есть!
Спасибище!!!!! я бы не скоро понял в чем проблема сам
есть уже в голове немного другой алгоритм, где эта проблема будет исключена.

Добавлено через 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]);
}
}
здесь в каждую ячейку массива заносится свой Лоадер, но в итоге получается только полоска из текстур по самому правому краю (т.е. вертикальная полоска). Не пойму - тут же не идет переприсвоение одного и того же экземпляра Лоадера. В чем бок ?


Последний раз редактировалось switcher!; 12.07.2009 в 16:26.
Старый 12.07.2009, 16:40
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 6  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Ну, выглядит всё нормально. Совет по стилю: объяви локальную переменную типа Loader и работай с ней, т.е.

Код AS3:
var aLoader:Loader;
var aRequest:URLRequest;
 
// ...
 
aLoader = new Loader();
aLoader.x = ...;
aLoader.y = ...;
aLoader.load(aRequest);
 
aMap[i][j] = aLoader;
Во-первых элементы массива для компилятора нетипизированы, а при работе с объявленной переменной мелкие ошибки, вроде опечаток, можно поймать на этапе компиляции. Во-вторых, работа с локальной переменной выполняется быстрее, чем доступ к элементам двумерного массива, даже если на таком простом коде никто и никогда не заметит разницы.
__________________
...убивать людей не удовольствия ради, но для еды.


Последний раз редактировалось DeliMIter; 12.07.2009 в 19:09.
Старый 12.07.2009, 17:14
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 7  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
сделал.

не помогает ни так:
Код 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...
бред какой-то...

Старый 12.07.2009, 17:15
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 8  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
цикл пустой у тебя:
for (var j:uint=0; j<mapWidth; j++);
то что ты предполагаешь в цикле выполняется только один раз с последним значением итератора


Последний раз редактировалось silin; 12.07.2009 в 17:18.
Старый 12.07.2009, 17:18
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 9  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
что у нас для внимательности принимают ?
мне срочно надо в аптеку

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

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

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

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


 


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


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