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

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

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

Регистрация: Oct 2009
Адрес: Донецк
Сообщений: 16
По умолчанию Как передать параметр прослушивателю события?

Такая ситуация. Есть несколько MovieClip-ов, расположенных в массиве, например:
Код AS3:
Main.stairs[0] = new RightHeart;
Main.stairs[1] = new RightHeart;
Main.stairs[2] = new RightHeart;
Необходимо для каждого экземпляра мувика передать в функцию, которая реагирует на событие клика мышкой по мувику индекс мувика. Т. е. когда кликают по Main.stairs[0] в функции, реагирующие на возникновение события должна появляться переменная со значением 0; кликают по Main.stairs[1] - переменная со значением 1, по Main.stairs[2] - переменная со значением 2. Подскажите, как это можно сделать? Я так понял, что через какое-то свойство МувиКлипа? Код должен быть примерно таким (заранее неправильный):
Код AS3:
Main.stairs[key].addEventListener(MouseEvent.CLICK, function(e: Event) {
  var keyMovie = key;
});
Как сделать правильно? Заранее благодарен за ответы.

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

Регистрация: Jan 2009
Сообщений: 1,651
много способов.
Самый элементарный - воспользоваться тем, что MovieClip - динамический класс
Код AS3:
for (var i:int=0; i<3; i++){
  var obj:RightHeart = new RightHeart ();
  obj.key = i; //у каждого объекта теперь свой key
  obj.addEventListener (MouseEvent.CLICK, clickHandler);
  Main.stairs.push(obj); 
}
 
function clickHandler (e:Event):void {
  var obj:RightHeart = e.target as RightHeart;
  trace (obj.key); //какой key у объекта по которому кликнули?
}
Есть и другие пособы. Сделать свое собвстенное событие, или для не динамических классов применять почти такой же метод, что я привел, но данные хранить в Dictionary.

P.S. Не ленитесь ставить () после объявления экземпляра класса. Не создавайте функцию в addEventListener - они потом висят в памяти.
__________________
мой пустой блог

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

Регистрация: Oct 2009
Адрес: Донецк
Сообщений: 16
Спасибо за быстрый ответ и за замечания :-) Буду пробовать.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Есть еще Array.indexOf()
)))
А правильнее по-моему просто завести в классе RightHeart свойство экземпляра key.
__________________
Reality.getBounds(this);

Старый 24.04.2010, 18:01
nitsik вне форума Посмотреть профиль Отправить личное сообщение для nitsik Найти все сообщения от nitsik
  № 5  
Ответить с цитированием
nitsik

Регистрация: Oct 2009
Адрес: Донецк
Сообщений: 16
Цитата:
Сообщение от Wolsh Посмотреть сообщение
А правильнее по-моему просто завести в классе RightHeart свойство экземпляра key.
Т. е.:
Код AS3:
Main.stairs[key].key = key;
, правильно?

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

Регистрация: Jan 2009
Сообщений: 1,651
не, это как раз мой способ, а он имеет ввиду создать класс

Код AS3:
package {
  public class RightHeart extends MovieClip {
    public var key:*;
  }
}
и связать его с мувиком. Так, как бы, правильнее, чтобы потом через много-много дней можно было вспомнить, какие свойства есть у объекта RightHeart, и откуда взялось key.
__________________
мой пустой блог

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS3:
...
public class RightHeart extends MovieClip // или Sprite
{
    private var _key:uint;
    //.... 
    public function set key (value:uint):void { _key = value }
    public function get key ():uint { return _key }
}
Код AS3:
Main.stairs[i].key = i;
Т.е. то же, что предлагал iflamberg, только его вариант опирается на то, что МувиКлип - динамический класс. Т.е. со спрайтом например такой способ не пройдет. Да и просто грамотно - иметь фиксированные поля, а не создавать свойства "на лету" в рантайме. МувиКлип был оставлен динамическим не для такого использования, а по необходимости.
__________________
Reality.getBounds(this);

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

Регистрация: Jan 2009
Сообщений: 1,651
А я такой *****кодер, такой *****кодер =) У меня даже есть
Код AS3:
package fbrg.utils {  public dynamic class DLoader extends Loader {}}
просто для того, чтобы в маленьких проектах не создавать новые классы расширяющие Loader для записи всего нескольких свойств.
__________________
мой пустой блог

Старый 24.04.2010, 19:05
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 9  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
грамотнее, на самом деле, создавать хэши с "приватными" классами, в которых хранятся нужные вам значения.
Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.utils.Dictionary;
 
	/**
	 * @author			BlooDHounD
	 * @playerversion	Flash 9
	 * @langversion		3.0
	 */
	public class test extends Sprite {
 
		public function test() {
			super();
 
			var mc:Sprite = new Sprite();
			// создаём свойства не создавая наследников
			this._hash[ mc ] = new MyProps();
		}
 
		private const _hash:Dictionary = new Dictionary();
 
		private function handler_click(event:MouseEvent):void {
			var props:MyProps = this._hash[ event.target ];
			// do something
		}
 
	}
 
}
 
internal final class MyProps {
 
	public function MyProps() {
		super();
	}
 
	public var var1:Number;
 
	public var var2:String;
 
}
если свойство всего одно, то можно вместо экземпляра класса записывать сразу значение.

Старый 24.04.2010, 19:18
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 10  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
я класс Dictionary упоминал вторым постом =)
__________________
мой пустой блог

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

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

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


 


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


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