2012-04-24 3 views
1

Я из фона php jquery, и в настоящее время я получаю доступ к flash as3, просто не уверен, как передать значения функции eventlistner. У меня есть следующее.Как передать значения eventlistener в flash as3

for (var i:uint = 0; i < asteroids.length; i++) 
{     
    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, changeValue);    
} 

public function changeValue(event:MouseEvent):void 
{ 
    playSound(anote); 
    trace(event.currentTarget); 
} 

каждый астероид, что я addeventlistner в петле мне нужно передать другое значение функции вар Аноте?

jquery сделаю.

$(".asteroids").click(function() { 

    // or something similar 
    var anote = $(this).attr('href'); 
    playSound(anote); 

    return false; 

}); 

Может кто-нибудь указать мне в правильном направлении.

ответ

2

Я предлагаю сделать класс для экземпляров Asteroid (если это то, что находится в массиве asteroids). Каждый из этих астероидов может иметь anote свойство с различными значениями (это точно отражает ваш .asteroids элементов href атрибут

public class Asteroid extends Sprite 
{ 
    public var anote:String = ""; 
} 

И потом:.

for each(var i:Asteroid in asteroids) 
{     
    i.x = Math.random() * 450; 
    i.y = Math.random() * 450; 
    i.addEventListener(MouseEvent.MOUSE_UP, changeValue);    
} 

public function changeValue(event:MouseEvent):void 
{ 
    playSound((event.currentTarget as Asteroid).anote); 
} 

В идеале, ваш Астероид класс также будет содержать код ваш пример и рекомендация, какой класс относится к методу playSound().


Другой вариант - создать свой собственный класс событий с свойством anote, которое вы можете установить при отправке и работе. Процесс довольно длительный, так вот ссылка на один из моих предыдущих ответов с объяснением углубленной реализации, что:

1

Самый простой способ я нашел, чтобы создать функцию в addEventListener линии:

for (var i:uint = 0; i < asteroids.length; i++) 
{ 

    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){ 
     changeValue(e, otherArguments); 
    }); 

} 



public function changeValue(event:MouseEvent, otherArguments:Object):void 
{ 

    playSound(anote); 
    trace(event.currentTarget); 

} 

В принципе вы создаете функцию-оболочку, которая может передавать какие-либо аргументы, нужно в функцию прослушивателя событий.

Другой способ достичь этого - создать свой собственный класс, который расширяет MouseEvent и использовать его, но это сложнее.

+0

Эта анонимная функция, которую вы создаете, заставляет меня чувствовать себя очень неловко. Также 'Object' нуждается в капитале' O' :) – Marty

+0

Это плохая практика, потому что вы получите дополнительное использование памяти для хранения оберток, Марти Уоллес предлагает лучший способ. – Yarg

+0

@Yarg Я знаю, что это не такой отличный способ добиться желаемого результата, но он требует наименьшей модификации исходного кода.Я просто подумал, что операционная система захочет иметь решение, которое соответствует содержащемуся ему коду, без необходимости создавать новые классы или редизайн. – annonymously

1

Это громоздко, чтобы написать новый класс для объекта или событие каждый раз, и неустойчиво использовать анонимную функцию. Просто возьмите его в переменной:

var listeners:Object = new Object(); 

for (var i:uint = 0; i < asteroids.length; i++) { 
    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    listeners[i] = changeValue(asteroids[i].anote); 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, listeners[i]); 
} 

public function changeValue(anote:Sound):Function { 
    return function(event:MouseEvent):void { 
    playSound(anote); 
    trace(event.currentTarget); 
    } 
} 

Затем, чтобы удалить слушателей позже:

for (i = 0; i < asteroids.length; i++) { 
    //trace("asteroid" + i + " (before): " + asteroids[i].hasEventListener(MouseEvent.MOUSE_UP)); 
    asteroids[i].removeEventListener(MouseEvent.MOUSE_UP, listeners[i]); 
    //trace("asteroid" + i + " (after): " + asteroids[i].hasEventListener(MouseEvent.MOUSE_UP)); 
} 

this answer См по этому вопросу тоже.

Смежные вопросы