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

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

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

Регистрация: Sep 2010
Сообщений: 90
По умолчанию Создание функций в цикле

Есть цикл в котором создаются кнопки, по нажатию каждой из которых должен запускаться соответствующий ей метод.
пример цикла:
Код AS3:
var i:int;
 
for (i = 0; i < 10; i++)
{
    var btn:UIButton;
 
    btn = new UIButton();
    btn.id = i;
    btn.handler = function():void
                       {
                           trace(btn.id);
                       }
}
На примере этого цикла каждой кнопке присваивается id, соответствующий i и мне нужно выводить при нажатии на нее ее id, но при нажатии на любую кнопку всегда выводится номер 9 (последний).
Помогите, пожалуйста, сделать корректное создание хендлеров с выводом идентификатора его кнопки.

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Анонимные функции – зло. Создайте одну функцию.
Код AS3:
function buttonHandler(e:MouseEvent):void
{
  var btn:UIButton = e.target as UIButton;
  if (bth)
    trace(btn.id);
}
 
var i:int;
for (i = 0; i < 10; i++)
{
    var btn:UIButton;
 
    btn = new UIButton();
    btn.id = i;
    btn.addEventListener(MouseEvent.CLICK, buttonHandler);
}

Старый 21.03.2013, 13:59
HorusWM вне форума Посмотреть профиль Отправить личное сообщение для HorusWM Найти все сообщения от HorusWM
  № 3  
Ответить с цитированием
HorusWM

Регистрация: Sep 2010
Сообщений: 90
Цитата:
Сообщение от bav Посмотреть сообщение
Анонимные функции – зло. Создайте одну функцию.
Код AS3:
function buttonHandler(e:MouseEvent):void
{
  var btn:UIButton = e.target as UIButton;
  if (bth)
    trace(btn.id);
}
 
var i:int;
for (i = 0; i < 10; i++)
{
    var btn:UIButton;
 
    btn = new UIButton();
    btn.id = i;
    btn.addEventListener(MouseEvent.CLICK, buttonHandler);
}
Согласен, стараюсь никогда не использовать подобный способ, но слушатели мне не подходят - движок растровый и все рисуется в одну битмапу, как следствие слушатели ни на что не повесить. Хотя, вы натолкнули меня на одну идею - проверять объект, находящийся под курсором, за это спасибо)

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
движок растровый и все рисуется в одну битмапу, как следствие слушатели ни на что не повесить.
Собственно, чем тогда вообще помогут эти кнопки?
Не может быть того, чтобы кнопки можно было нажать мышью, но при этом нельзя было повесить никаких слушателей. По-моему только с SimpleButton какая-то фигня подобная

Старый 21.03.2013, 14:09
HorusWM вне форума Посмотреть профиль Отправить личное сообщение для HorusWM Найти все сообщения от HorusWM
  № 5  
Ответить с цитированием
HorusWM

Регистрация: Sep 2010
Сообщений: 90
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Собственно, чем тогда вообще помогут эти кнопки?
Не может быть того, чтобы кнопки можно было нажать мышью, но при этом нельзя было повесить никаких слушателей. По-моему только с SimpleButton какая-то фигня подобная
Кнопки наследуются от общего класса объектов, который не наследуется от классов экранных объектов, а лишь хранит информацию о массиве пикселей, которые идут в отрисовку, позиции, где их рисовать, порядке отрисовки, bound-бокса объекта и т.п. А слушатель можно повесить только на дисплей обджект, насколько я помню. Чем помогут? На мой взгляд copyPixels самый быстрый способ отрисовки, во всяком случае спрайты и мувиКлипы у меня сильно грузили сцены.

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

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
я тоже не понял прикола с невозможнстью повесить мышиные слушатели при том, что 'нужно выводить при нажатии на нее ее id'
по сути вопроса в этом анонимном handler'е видна var btn:UIButton, которая после отработки цикла естественно указывает на последний, а нужна ссылка на конкретный экземпляр
т.е. если нужен изврат с определением handler именно в цикле, то как-то так это может быть
(это только для посмотреть, здесь конечно логичнее этот handler в самом UIButton и определить)
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Main extends Sprite
	{
 
		public function Main():void
		{
			var i:int;
 
			for (i = 0; i < 10; i++)
			{
				var btn:UIButton;
 
				btn = new UIButton();
				btn.id = i;
				btn.y = i * 25;
				addChild(btn);
				btn.handler = function():void
			   {
				   trace("this.id: " + UIButton(this).id);
				   trace("btn.id: " + btn.id);
			   }
			}
			// чтобы как-то посмотреть работу btn.handler
			this.addEventListener(MouseEvent.CLICK, this_click);
		}
 
		private function this_click(e:MouseEvent):void 
		{
			var btn:UIButton = e.target as UIButton;
			btn.handler();
		}
 
	}
 
}
import flash.display.Sprite;
class UIButton extends Sprite 
{
	public var id:int;
	public var handler:Function;
	public function UIButton() 
	{
		graphics.beginFill(0x0);
		graphics.drawRect(0, 0, 60, 20);
 
	}
}

Старый 21.03.2013, 14:43
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 7  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
А на клик вы водписываете stage или другой контейнер, и потом смотрите где клик упал, и именно тот объект который находится под курсором и ловит его ?

Старый 21.03.2013, 14:44
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Анонимные функции – зло
А вы вкурсе, что в той же джаве - анонимные функции используются так же охотно, как и методы класса? Кроме того, есть еще и анонимные классы - которые тоже используются на ура!
Так кто же прав, когда GC одинаков почти в этих 2х языках?
__________________
Марк Tween

Старый 21.03.2013, 14:47
HorusWM вне форума Посмотреть профиль Отправить личное сообщение для HorusWM Найти все сообщения от HorusWM
  № 9  
Ответить с цитированием
HorusWM

Регистрация: Sep 2010
Сообщений: 90
silin, я описал почему нет возможности - мои объекты не являются наследниками экранных объектов флеша, они все просто набор информации о пикселях и в каком месте их рисовать в общем битмап-листе, выводимом на экран. Да, я жертвую слушателями (хотя, редко когда они действительно мне нужны) взамен скорости.

Цитата:
Сообщение от AlexLucas Посмотреть сообщение
А на клик вы водписываете stage или другой контейнер, и потом смотрите где клик упал, и именно тот объект который находится под курсором и ловит его ?
Именно так и сделал, AlexLucas )
Цитата:
Сообщение от HorusWM
Хотя, вы натолкнули меня на одну идею - проверять объект, находящийся под курсором, за это спасибо)

Старый 21.03.2013, 15:03
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 10  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
А если объекты накладываются друг на друга, как вы вычислите кто ловит событие ?

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

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

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


 


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


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