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

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

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

Регистрация: Aug 2011
Сообщений: 29
По умолчанию Обращение к экземпляру класса и eventDispatcher (нубские вопросы)

Привет.

Пара вопросов


Main.as

Код AS3:
package 
{
 
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.display.DisplayObject;
	import elements.Tower;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author reQuiem
	 */
	public class Main extends Sprite 
	{
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			addTower();
		}
 
		private function addTower():void 
		{
			var tower_1: Tower = new Tower();
			this.addChild(tower_1);
			tower_1.x = 300;
			tower_1.y = 300;
			tower_1.addEventListener("towerClick", towerClicked);
			trace("tower ready");
		}
 
		public function towerClicked (e:Event): void
        {
				trace("tower clicked");
				stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveFunc);
				stage.addEventListener(MouseEvent.MOUSE_UP, mouseUPFunc);
        }
		private function mouseMoveFunc (e:MouseEvent ):void 
		{
			trace("mouse MOVE");	
		}
 
		private function mouseUPFunc (e:MouseEvent ):void 
		{
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveFunc);
		}
 
	}
 
}


Tower.as
Код AS3:
package elements 
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.DisplayObject;
	import flash.events.EventDispatcher;
	/**
	 * ...
	 * @author reQuiem
	 */
	public class Tower extends MovieClip
	{
 
		public function Tower() 
		{
			this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownFunc);
		}
 
 
		public function mouseMoveFunc():void 
		{
			trace("OK");
		}
 
		public function mouseDownFunc(e:MouseEvent): void
        {
			dispatchEvent(new Event("towerClick"));
        }
	}
 
}

Вопросы:

1)Если я диспатчу событие из класса то подписать на это событие я мог только экземпляр этого класса?

просто addEventListener("towerClick", towerClicked); не ловит, а tower_1.addEventListener("towerClick", towerClicked); ловит.

2) не получается вызвать методы( и менять значение переменных) через экземпляр класса в функции отлично от той где я его создаю.



то есть сейчас в мейне у меня есть

Код AS3:
var tower_1: Tower = new Tower();
this.addChild(tower_1);
tower_1.x = 300;

но если я попытаюсь изменить tower_1.x в любом другом месте - выдает ошибку. ( в это время tower_1 гарантированно существует и например ловит\кастует события).


Вот пока все. Знаю что вопросы очень нубские но пытаясь пересесть кадров они мне пока не даются.
Спасибо.

Старый 28.01.2012, 21:55
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 2  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Цитата:
1)Если я диспатчу событие из класса то подписать на это событие я мог только экземпляр этого класса?
Ну еще к экземплярам, любого другого класса, который шлет этоже сообщение. В общем случае да подписываться нужно к тому, кто шлет событие. (Ну еще можно подписаться к контейнеру в котором содержится экземляр DisplayObject, рассылающий событие, это относится только к displayList и если событие всплывающее-bubbles).
Цитата:
2) не получается вызвать методы( и менять значение переменных) через экземпляр класса в функции отлично от той где я его создаю.
Это происходит потому, что вы теряете ссылку на объект, так как объявляете ее локально и по завершению функции она теряется нужно как то так:
Код AS3:
public class Main extends Sprite 
	{
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			addTower();
		}
 
		private var tower_1:Tower;
 
		private function addTower():void 
		{
			tower_1 = new Tower();
			this.addChild(tower_1);
			tower_1.x = 300;
			tower_1.y = 300;
			tower_1.addEventListener("towerClick", towerClicked);
			trace("tower ready");
		}}
__________________
http://www.chessmax.ru


Последний раз редактировалось Inet_PC; 28.01.2012 в 21:58.
Старый 29.01.2012, 01:19
reQuiem вне форума Посмотреть профиль Отправить личное сообщение для reQuiem Найти все сообщения от reQuiem
  № 3  
Ответить с цитированием
reQuiem

Регистрация: Aug 2011
Сообщений: 29
1) ок. понял.

2) ага, если у меня известное количество объектов ясно, а что если я добавляю эти объекты по ходу дела и не знаю сколько у меня будет экземпляров и каких объектов? Создавать для каждого возможно появящегося типа(класса) свою переменную в мейне заранее?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
1)Если я диспатчу событие из класса то подписать на это событие я мог только экземпляр этого класса?
Путаница в формулировках. Подписать НА ПОЛУЧЕНИЕ СОБЫТИЯ вы можете кого угодно. Но рассылать событие будет экземпляр или его контейнер в случае всплытия, и к ним вы ДОБАВЛЯЕТЕ СЛУШАТЕЛЬ (addEventListener). Слушатель это метод (обработчик события, handler), который указывается вторым параметром в addEventListener. Вы добавляете его объекту как слушателя событий, которые будет рассылать этот объект.

2) Конечно нет. Ссылки на экземпляры не обязательно должны храниться в приватных полях класса напрямую, они могут храниться в массиве или векторе, или добавленные как дети дисплейлиста в контейнере. Но в любом случае на объект должна быть хотя бы одна ссылка, иначе он будет удален из памяти Сборщиком Мусора.
Что касается событий, которые эти объекты ыбудут рассылать – вы подпишитесь на них сразу после создания объекта, а в обработчике событий узнать, какой именно экземпляр послал событие, можно из свойств объекта События, который непременно получает слушатель-обработчик. У этого объекта есть поля target и currentTarget.
__________________
Reality.getBounds(this);

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

Регистрация: Aug 2011
Сообщений: 29
спасибо, разобрался.

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

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

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


 


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


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