views:

20

answers:

1

i have a few filters on a sprite. on mouse over i would like to access one of the filters in the filters array, but i'm having a bit of trouble trying to accomplish this.

mySprite.filters = [new DropShadowFilter(), new GlowFilter(), new BlurFilter()];
mySprite.addEventListener(MouseEvent.MOUSE_OVER, mouseOverEventHandler);

function mouseOverEventHandler(evt:MouseEvent)
     {
     //obtain indexOf the GlowFilter
     trace(evt.currentTarget.filters[evt.currentTarget.filters.indexOf([Object GlowFilter])]));
     }

the above code doesn't work. what's the proper way to get the index of a specific filter in a filters array?

+3  A: 

If I understand correctly, you're essentially trying to do this:

 var index:int = evt.currentTarget.filters.indexOf([Object GlowFilter]);

The bracketed part is not valid Actionscript it shouldn't even compile. What you need to do is to iterate over the filters and test them yourself since there's no way to search for a specific class with indexOf.

Try this instead:

function mouseOverEventHandler(evt:MouseEvent) {
    var glowFilter:GlowFilter;
    for (var i:int = 0; i < evt.target.filters.length; i++) {
        if (evt.target.filters[i] is GlowFilter) {
            glowFilter = evt.target.filters[i];
            break;
        }
    }
}

Also, if you're going to fiddle with the filters in the array Flash won't accept in-place modifications, so you need to re-set the array once you've changed it:

function mouseOverEventHandler(evt:MouseEvent) {
    var glowFilter:GlowFilter;
    for (var i:int = 0; i < evt.target.filters.length; i++) {
        if (evt.target.filters[i] is GlowFilter) {
            glowFilter = evt.target.filters[i];
            break;
        }
    }

    if (!glowFilter) return;

    glowFilter.blurX = 10;
    var filters:Array = evt.target.filters;
    filters[i] = glowFilter;
    evt.target.filters = filters;

}
grapefrukt
thanks. this should work. just a tiny error on your example code, i think your loop condition should be i < evt.target.filters.length
TheDarkInI1978
that's what it get for writing it without testing ;) fixed it now!
grapefrukt