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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.10.2008, 18:00
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 1  
Ответить с цитированием
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
По умолчанию передача параметров функции при клике

Преамбула:
На экране есть картинка, на картинке несколько десятков областей(кнопок) при наведении мыши или кликах по ним совершаются разные действия. Когда эта программа была сделана в AS2 все кнопки содержали около двух десятков строк кода и были одинаковые, единственная разница - номер в массиве соответствующий области.
Сейчас я хочу переделать на AS3 т.к. в ближайшем будущем программа должна быть значительно увеличена и надо минимизировать объём кода.

Планировал создать три функции которые будут выполняться при наведении на кнопку, клике и убирании курсора с кнопки. А так же по три отслеживателя события на каждую кнопку.
Проблема возникла при передаче функции параметра - номера области в массиве.
Объявление функции:
Код:
function limys (p:Number, event:MouseEvent):void
{
	// выполняемый код
}
Вызов функции наведением на кнопку:
Код:
k1.addEventListener(MouseEvent.MOUSE_OVER, limys(1));
Вопрос: В чём ошибка или как достичь желаемого результата

Старый 03.10.2008, 18:59
Andrei666 вне форума Посмотреть профиль Отправить личное сообщение для Andrei666 Найти все сообщения от Andrei666
  № 2  
Ответить с цитированием
Andrei666

Регистрация: Jul 2008
Сообщений: 23
Ну если в лоб, то:
Код:
function limys1(event:MouseEvent):void
{
	// выполняемый код
}
function limys2(event:MouseEvent):void
{
	// выполняемый код
}
....
Код:
k1.addEventListener(MouseEvent.MOUSE_OVER, limys1);
k1.addEventListener(MouseEvent.MOUSE_OVER, limys2);
....
Но если у них есть хоть что общее то проще использовать event.target

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

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Орец, передавать параметры в обработчики событий нельзя.
Номер области в массиве сохраняйте в самой кнопке.
А достать его можно так:
Код:
function limys (event:MouseEvent):void
{
	(event.currentTarget as Btn).id;
}
здесь Btn - класс вашей кнопки(области картинки).

Старый 06.10.2008, 10:51
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 4  
Ответить с цитированием
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
Цитата:
Сообщение от kackbip Посмотреть сообщение
Орец, передавать параметры в обработчики событий нельзя.
Спасибо. Жаль.
Цитата:
Сообщение от kackbip Посмотреть сообщение
Номер области в массиве сохраняйте в самой кнопке.
Это как? Мне казалось что в кнопках AS3 ничего кроме названия сохранить нельзя. А название не может быть числовым.
Вот имя я могу достать как:
Код:
(event.currentTarget).name;
Цитата:
Сообщение от kackbip Посмотреть сообщение
А достать его можно так:
Код:
function limys (event:MouseEvent):void
{
	(event.currentTarget as Btn).id;
}
здесь Btn - класс вашей кнопки(области картинки).
А можно немного более развёрнутый пример доставания? И того как в кнопке номер сохранить


Последний раз редактировалось Орец; 06.10.2008 в 11:18.
Старый 06.10.2008, 11:37
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 5  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Вам нужно просто создать класс, где помимо прочего будет публичное свойство id. Вы при инициализации вашего творения раздаете всем нужные id, а при клике считываете.

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Если все все равно пишется на таймлайне, то проще будет:
Код:
var hash:Dictionary = new Dictionary();
hash[myClip] = i; // где i уникальный ключ по которому можно будет проверить
// какой из клипов вызвал обработчик события типа:
function clickHandler(evt:MouseEvent):void
{
    if (hash[evt.target] == i) // вы кликнули пo клипу #i
}
__________________
Hell is the possibility of sanity

Старый 16.12.2008, 15:31
icansee вне форума Посмотреть профиль Отправить личное сообщение для icansee Найти все сообщения от icansee
  № 7  
Ответить с цитированием
icansee

Регистрация: Dec 2008
Сообщений: 1
Привет!

Слушайте, ну я совсем новенький. До этого занимался только простой флэш-анимацией, а сейчас решил разобраться с AS.

Вопрос у меня похожий.

На сцене добавлено несколько муви-клипов с разными именами, отличающимися только индексом (hs0, hs1, hs2 и т.д.). На сцене их будет много и они все выполняют одно и то же действие. По этому я создал цикл для одинаковых слушателей.

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

Ну не создавать же столько функций, сколько объектов в сцене, так ведь? И слушателей не за чем дублировать. Но как это сделать вот это соответствие:

наводя мышкой на определенный объект мы выводим определенную строку из массива?

Код AS3:
var colorXML:XML;
var xmlReq:URLRequest = new URLRequest("colorxml.xml");
var xmlLoader:URLLoader = new URLLoader();
var hash:Dictionary = new Dictionary();
var movieNumber;
 
function xmlLoaded(event:Event):void {
	colorXML = new XML(xmlLoader.data);
	colorXML.ignoreWhitespace = true;
	trace("XML loaded!");
}
 
xmlLoader.load(xmlReq);
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
 
 
for (var i=0; i<3; i++) {
	this["hs" + i].addEventListener(MouseEvent.ROLL_OVER, onBoxOver);
	hash[i] = movieNumber;
 
}
 
function onBoxOver(evt:MouseEvent):void {
	var _text:String;
	var _textArray:Array = new Array;
 
	for (var i=0; i<3; i++) {
		_textArray[i]=colorXML.store[i].name;
	}
 
	if (hash[evt.target] == movieNumber) {
		_text = _textArray[1];// как сделать соответствие выбранного объекта определенному значению массива?
	}
	trace(_text);
}
За ранее огромное спасибо!

Старый 17.12.2008, 13:35
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 8  
Ответить с цитированием
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
Как не дублировать слушателей не знаю, создавать их для вручную сделанных объектов у меня не получается. Тема где это разбиралось.

А функция получала название вызывающего объекта:
Код AS3:
var par=(event.currentTarget).name;
Потом обрезались символы имени, так чтобы остался лишь номер:
Код AS3:
par=par.replace("hs","");
После чего использовалось значение из массива:
Код AS3:
massiv[par][0]


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

Теги
функция
Опции темы
Опции просмотра

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

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


 


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


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