1
votes

Background Information:

  • I am using Adobe Flash CS4
  • I am using Actionscript 3
  • I am publishing my code into an Adobe AIR document, however I am not sure that this is relevant to this particular problem.

  • I've created two symbols in the library, large rectangles, and placed instances of them on the stage.

  • I'm using "getObjectsUnderPoint" to detect the objects under where the mouse is clicked.
  • I have verified that getObjectsUnderPoint is detecting the symbol instances by tracing the names.

The Problem

  • The traced names of the objects detected by getObjectsUnderPoint are all instance1, instance2, instance3, etc. even though I have named the instances.
  • This causes an issue when trying to ensure that the mouse was clicked on a zone encompassed by either one of the rectangles, as I can't check if object[i].name == "leftbox" , and the instance1, instance2, etc. names change as I add/remove things from the stage, so I do not want to check for instance2 and instance3 (which are as of right now the 2 boxes I've created, which are named "leftbox" and "rightbox" respectively.

The Question:

Am I doing something wrong in detecting the names? How do I actually detect the instance names that I have created on the stage through the ActionScript in my class?

Here is my code:

        var pt:Point = new Point(e.stageX, e.stageY);
        var objects:Array = getObjectsUnderPoint(pt);
        var action = 0;

        for(var i=0; i< objects.length; i++) {
            trace(objects[i].name);
        }

        if( objects.indexOf('left_box') >= 0 ){
            action = 1;

        }
        if(objects.indexOf('right_box') >= 0 ){
            action = 2;

        }
3
Can you post the code for the getObjectsUnderPoint(pt); function?crooksy88
the best I can do is provide you with some documentation, as it is a part of Flash itself: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…BumbleShrimp
SO seems to not allow the link I just posted to function properly, here is a tinyURL that points to the same thing: tinyurl.com/44mdaseBumbleShrimp

3 Answers

1
votes

Reminds me of a quotation "I do not have the solution to your problem, but I certainly admire the problem"

If you try to trace(objects[i]) you'll see the function getObjectsUnderPoint is returning a shape not the MovieClip, so you never get the name you are looking for.

1
votes

Fahim Akhter pointed out in a comment that I was tracing shapes, not objects. This led me to a more accurate google search than I had been able to craft thus far.

The search led me to this forum thread: http://www.actionscript.org/forums/showthread.php3?t=231181

And in this particular post (number 6), the author pointed out that

"It turns out that getObjectsUnderPoint returns an array of the simplest object- the child-est, if that makes any sense. I was able to solve part of the problem by simply adding a .parent to the end of my variable..."

I appended .parent to the object, and received the appropriate name:

        var pt:Point = new Point(e.stageX, e.stageY);
        var objects:Array = stage.getObjectsUnderPoint(pt);
        var action = 0;

        for(var i=0; i< objects.length; i++) {
            trace(objects[i].parent.name);
        }

        if( objects.indexOf('left_box') >= 0 ){
            action = 1;

        }
        if(objects.indexOf('right_box') >= 0 ){
            action = 2;

        }

This solves my problem, and hopefully leads us all to a better understanding of getObjectsUnderPoint.

1
votes

Taking forward Fahim Akhter's answer,

You can then loop to get the parent until the object is a movieclip

var o:DisplayObject=objects[i];
while(!(o.parent is MovieClip)) {
    o=o.parent;
}
var myMovieClip:MovieClip=o.parent;

This should give you a movie clip in myMovieClip and when you trace myMovieClip.name, you'll get what you are looking for.

This will also work for multiple level symbols (where 1 symbol contains another)