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

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

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

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Question Проблема с добавлением в список отображения массива объектов

Извиняюсь, что спрашиваю, наверное, глупый вопрос, но экшн скрипт я начал изучать недавно и он поставил меня в тупик.
Имеется мувик на одном из кадров главной таймлайн (GamePlay), в котором создается массив объектов дочерних от класса Star (в классе прописано движение звезд). Подклассы этого класса прикреплены к разным мувикам с изображением звезд разной формы и цвета.
В общем вот код:
Код AS3:
package main
{
 
	import flash.display.*;
	import stars.*;
 
 
 
	public class GamePlay extends MovieClip
	{
 
 
 
		public function GamePlay()
		{
			stage.focus = this;
			this.focusRect = false;
			addStars ();
		}
		public function addStars ():void
		{
			var arrayOfStar15Big: Array = new Array ();
			for (var i:int = 0; i < 5; i++)
			{
				arrayOfStar15Big.push(new Star15Big ());
				arrayOfStar15Big[i].x = Math.floor(Math.random() * 900);
				arrayOfStar15Big[i].y = Math.floor(Math.random() * 660);
				addChild(arrayOfStar15Big [i]);
			}
			var arrayOfStar6Red: Array = new Array ();
			for (var j:int = 0; j < 7; j++)
			{
				arrayOfStar6Red.push(new Star6Red ());
				arrayOfStar6Red[i].x = Math.floor(Math.random() * 900);
				arrayOfStar6Red[i].y = Math.floor(Math.random() * 660);
				addChild(arrayOfStar6Red [i]);
			}
		}
	}
 
}
Проблема в том, что звезды на сцене не появляются, и в отладчике видно что массивы равны undefined а root, stage и parent класса Star и дочерних классов равны null. Если же добавляешь звезды на мувик визуально вручную и даешь им названия - все отлично работает.
И еще - такой же код у меня прекрасно работал в другом fla файле, а тут возникли проблемы. Можно ли это как то исправить, а то расставлять звезды вручную по ряду причин не вариант.


Последний раз редактировалось dimarik; 07.09.2011 в 00:50.
Старый 07.09.2011, 02:08
veisss вне форума Посмотреть профиль Отправить личное сообщение для veisss Найти все сообщения от veisss
  № 2  
Ответить с цитированием
veisss
[+1 16.08.10]

Регистрация: Jun 2009
Сообщений: 93
По моему ошибка в циклах
попробуй так
Код AS3:
var arrayOfStar15Big: Array = new Array ();
for (var i:int = 0; i < 5; i++)
{
	var star15Big:Star15Big=new Star15Big ();
	star15Big.x = Math.floor(Math.random() * 900);
	star15Big.y = Math.floor(Math.random() * 660);
	addChild(star15Big);
  	arrayOfStar15Big.push(star15Big)
}
 
var arrayOfStar6Red: Array = new Array ();
for (var j:int = 0; j < 7; j++)
{
	var star6Red:Star6Red=new Star6Red ();
	star6Red.x = Math.floor(Math.random() * 900);
	star6Red.y = Math.floor(Math.random() * 660);
	addChild(star6Red);
	arrayOfStar6Red.push(new Star6Red ());
}

Старый 07.09.2011, 04:33
Newred вне форума Посмотреть профиль Отправить личное сообщение для Newred Посетить домашнюю страницу Newred Найти все сообщения от Newred
  № 3  
Ответить с цитированием
Newred
 
Аватар для Newred

Регистрация: May 2010
Адрес: Киев, Украина
Сообщений: 140
Записей в блоге: 2
пришлось моделировать у себя текущую ситуацию....
оказалось банальная ошибка, вы во втором цикле перепутали операторы j != i

рабочий код:
Код AS3:
package main
{	
	import flash.display.*;
	import stars.*;
 
	public class GamePlay extends MovieClip
	{
		public function GamePlay()
		{
			stage.focus = this;
			this.focusRect = false;
			addStars ();
		}
		public function addStars ():void
		{
			var arrayOfStar15Big: Array = new Array ();
			for (var i:int = 0; i < 5; i++)
			{	
				arrayOfStar15Big.push(new Star15Big());
				arrayOfStar15Big[i].x = Math.floor(Math.random() * 900);
				arrayOfStar15Big[i].y = Math.floor(Math.random() * 660);
				addChild(arrayOfStar15Big[i]);
			}
			var arrayOfStar6Red: Array = new Array ();
			for (var j:int = 0; j < 7; j++)
			{
				arrayOfStar6Red.push(new Star6Red());
				arrayOfStar6Red[j].x = Math.floor(Math.random() * 900);
				arrayOfStar6Red[j].y = Math.floor(Math.random() * 660);
				addChild(arrayOfStar6Red[j]);
			}
		}
	}
}

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

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
veisss большое спасибо за помощь, но код у вас не правильный, и без массива объектов тут никак не обойдешся

Добавлено через 4 минуты
Newred тоже большое спасибо за помощь, но дело не в этом. Код по идее работал хотя бы с первым массивом

Старый 07.09.2011, 04:53
Newred вне форума Посмотреть профиль Отправить личное сообщение для Newred Посетить домашнюю страницу Newred Найти все сообщения от Newred
  № 5  
Ответить с цитированием
Newred
 
Аватар для Newred

Регистрация: May 2010
Адрес: Киев, Украина
Сообщений: 140
Записей в блоге: 2
вот вам исходники)
Вложения
Тип файла: rar star.rar (9.7 Кб, 36 просмотров)

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
veisss большое спасибо за помощь, но код у вас не правильный, и без массива объектов тут никак не обойдешся
Что в нем неправильного? Даже приводить не надо
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Newred скопировал ваши исходники к себе в проект, тем более что пакеты и все названия совпадают. Результат такой же как и в первом посте, собственно я уже говорил что этот код работает в другом fla-файле. Тут наверное проблема в чем то другом, буду думать, спасибо в любом случае.

Добавлено через 34 минуты
Кажется стал догадоваться в чем проблема, проблема все таки в коде класа Star, осталось придумать как это исправить.
вот код класса:
Код:
package stars
{
	import flash.display.*;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	

	public class Star extends MovieClip
	{
		public static var correctionVelosity = 1; // придумать как синхронизировать движение и сделать разные скорости
		public var velosity:Number;
		
		

		public function Star()
		{
			
			velosity = 1;
			this.stage.addEventListener (KeyboardEvent.KEY_DOWN, moveStar); //проблема где то здесь.
			addEventListener (Event.ENTER_FRAME, move);
		}
		public function move (e:Event):void
		{
			this.x -=  velosity; // возможно отсюда надо вычитать константу и затем проверять что бы она не была < 0
			if (this.x < 0)
			{
				this.x = parent.width + 10;
			}
			
		}
		public function moveStar (e:KeyboardEvent):void
		{
			if (e.keyCode == Keyboard.SPACE)
			{				
				
				acceleration ();
				
			}
			if (e.keyCode == Keyboard.SHIFT)
			{				
				
				deceleration ();
				
			}
		}
		public function acceleration ():void
		{
			velosity++;
			if (velosity > 30)
			{
				velosity = 30;
			}
				
		}
		public function deceleration ():void
		{
			velosity--;
			if (velosity < 1)
			{
				velosity = 1;
			}
		}

		

	}

}
по моему проблема в строчке this.stage.addEventListener (KeyboardEvent.KEY_DOWN, moveStar); я уже сталкивался с тем, что объекты на которые не наведен фокус выдают при использовании слушателя клавиатуры ошибку null, но здесь фокус наводится на весь мувик GamePlay.

Добавлено через 38 минут
То есть код слушателя клавиатуры срабатывает раньше чем объект добавляется на сцену, так помоему, и по этому он дает null в ран-тайме

Добавлено через 38 минут
Вопрос как это исправить

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
ADDED_TO_STAGE
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Сделал вот так:
Код:
package stars
{
	import flash.display.*;
	import flash.events.*;
	import flash.ui.Keyboard;
	

	public class Star extends MovieClip
	{
		public static var correctionVelosity = 1; // придумать как синхронизировать движение и сделать разные скорости
		public var velosity:Number;
		
		

		public function Star()
		{
			
			velosity = 1;
			addEventListener (Event.ADDED_TO_STAGE, addListener);
			
			addEventListener (Event.ENTER_FRAME, move);
		}
		public function addListener (e:Event):void
		{
			if (this.stage != null)
			{
			stage.addEventListener (KeyboardEvent.KEY_DOWN, moveStar);
			}
		}
		
		public function move (e:Event):void
		{
			this.x -=  velosity; // возможно отсюда надо вычитать константу и затем проверять что бы она не была < 0
			if (this.x < 0)
			{
				this.x = parent.width + 10;
			}
			
		}
		public function moveStar (e:KeyboardEvent):void
		{
			if (e.keyCode == Keyboard.SPACE)
			{				
				
				acceleration ();
				
			}
			if (e.keyCode == Keyboard.SHIFT)
			{				
				
				deceleration ();
				
			}
		}
		public function acceleration ():void
		{
			velosity++;
			if (velosity > 30)
			{
				velosity = 30;
			}
				
		}
		public function deceleration ():void
		{
			velosity--;
			if (velosity < 1)
			{
				velosity = 1;
			}
		}

		

	}

}
Результат - TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at stars::Star/move()


Последний раз редактировалось PainKiller; 07.09.2011 в 23:51.
Старый 08.09.2011, 00:49
veisss вне форума Посмотреть профиль Отправить личное сообщение для veisss Найти все сообщения от veisss
  № 10  
Ответить с цитированием
veisss
[+1 16.08.10]

Регистрация: Jun 2009
Сообщений: 93
У меня у самого там опечатка во втором цикле
Так правильнее
Код AS3:
var arrayOfStar6Red: Array = new Array ();
for (var j:int = 0; j < 7; j++)
{
	var star6Red:Star6Red=new Star6Red ();
	star6Red.x = Math.floor(Math.random() * 900);
	star6Red.y = Math.floor(Math.random() * 660);
	addChild(star6Red);
	arrayOfStar6Red.push(star6Red);
}
Тут этот объект добавляется в массив
Код AS3:
arrayOfStar6Red.push(star6Red);


А Error #1009: тебе выдает эта строчка
Код AS3:
this.x = parent.width + 10;//parent тут null
Это
Код AS3:
addEventListener (Event.ENTER_FRAME, move);
перенеси в
Код AS3:
public function addListener (e:Event):void
И всегда когда пользуешься опасными переменными(parent,stage...)
лучше проверяй их
Код AS3:
if(parent){
    //делай с parent-ом что хочешь
}else{
    //ой 
}

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

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

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


 


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


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