yeeen
yeeen

Reputation: 4945

How to use a static function in Actionscript 3.0?

I would like to have a few objects (e.g. 20 of them), each time I mouse over any one of them, it moves up and each time my mouse leaves, it moves down.

obj1.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1);
obj1.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2);
obj2.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1);
obj2.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2);
obj3.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1);
obj3.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2);
obj4.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1);
obj4.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2);
obj5.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1);
obj5.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2);
//and etc...

function moveMyself1(e:MouseEvent):void{
    obj1.y -= 30;
}

function moveMyself2(e:MouseEvent):void{
    obj1.y += 30;
}

I don't want to add an event listener for each of the objects, then I would have 40 methods! Is there any way to write a static method so I can use for all the objects?

And I realized the obj is moving up and down too fast. If you try to put your mouse at the bottom end of the obj, you will see it jumping up n down very fast. Is there any way I can control the speed of the obj?

I wanted to have a few objects in which the user can mouse over and discover treasure underneath. The user can click on the treasure as well. I got this idea from a game. The object will fall back to the same position after the user moves the mouse away. If the object moves too fast, the user can't get to click on the treasure inside. Any idea on how to solve the movement issue?

Updated

var elements : Array = new Array();
var elements2 : Array = new Array();

for (var i:int = 1; i <= 5; i++) {
    elements[i] = this['obj' + i];
    elements2[i] = this['tracking' + i];
}

for each(var element_1 : IEventDispatcher in elements){
    element_1.addEventListener(MouseEvent.MOUSE_OVER, moveUp);  
}

for each(var element_2 : IEventDispatcher in elements2){
    element_2.addEventListener(MouseEvent.MOUSE_OUT, moveDown);
}

function moveUp(e:MouseEvent):void{
     e.currentTarget.y -= 30;
}

function moveDown(e:MouseEvent):void{
     elements[elements2.indexOf(e.currentTarget)].y += 30;
}

Above is my updated code, I tried Richard's suggestion, but it seemed like the objects are moving up and down out of my control.

Upvotes: 3

Views: 1075

Answers (3)

grapefrukt
grapefrukt

Reputation: 27045

add all the clips you want to listen on to a container:

var container:Sprite = new Sprite;
addChild(container);
// rinse and repeat:
container.addChild(objN);

Then add an event listener to that container:

container.addEventListener(MouseEvent.MOUSE_OVER, handleContainerMouseOver } );
container.addEventListener(MouseEvent.MOUSE_OUT, handleContainerMouseOut });

function handleContainerMouseOver(e:MouseEvent):void{
    e.target.y -= 30;
}

function handleContainerMouseOut(e:MouseEvent):void{
    e.target.y += 30;
}

As a bonus: If you have that many objects named sequentially you can go like this:

for (var i:int = 0; i <= 20; i++) {
    container.addChild(this['obj' + i]);
}

this['obj' + i] will resolve to obj1, obj2 and so on.

Upvotes: 1

Richard Szalay
Richard Szalay

Reputation: 84794

You could put the objects into an array and pass the object from the event handler to your method that applies the logic:

var elements : Array = [obj1, obj2, obj3, obj4];

for each(var element : IEventDispatcher in elements)
{
    element.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event) { moveUp(this); } );
    element.addEventListener(MouseEvent.MOUSE_OUT, function(e:Event) { moveDown(this); });
}

function moveUp(element : UIElement)
{
    element.y += 30;
}

function moveDown(element : UIElement)
{
    element.y -= 30;
}

As far as the movement speed, perhaps you could trigger an animation instead?

Upvotes: 3

danii
danii

Reputation: 5703

You don't need to code a function for each object, since you can refer to the object that is listening to the event as the 'target' of the event, so:

function moveUp(e:MouseEvent):void
{
    e.currentTarget.y -= 30;
}

function moveDown(e:MouseEvent):void
{
    e.currentTarget.y += 30;
}

Also, the reason you see the object moving up&down really fast is because when you change the object's position, the mouse stops being inside the object so the MOUSE_OUT event fires, then you change the object's position again to where the mouse is and the MOUSE_OVER event fires and so on. The trace would be:

The object is at y=5 (for example). You move the mouse over (mouse is at y=5). MOUSE_OVER event fires -> the object moves up (y=35) -> MOUSE_OUT event fires -> the object moves down (y=5) -> since the mouse is still at y=5, MOUSE_OVER event fires -> rinse&repeat.

Please bear in mind that when you set the y of the object, you are not creating a movement animation, but kind of "teletransporting" it to that position.

Upvotes: 6

Related Questions