user3161756
user3161756

Reputation: 73

AS3 Accessing stage objects from a class

I'm writing a class Player, and I'm developing collisions but flash gives me an error to this line:

function checkCollision(event:Event)
        {
            if (this.hitTestObject(stage.wall)) // THIS LINE!!!!!!!!
            {
                trace("HIT");
            }
            else
            {
                trace("MISS");

            }
        }
 }

The error is:

Access of possibly undefined property wall through a reference with static type flash.display:Stage.

How can I access to wall ? wall is a symbol on the stage... Should I develop it in another way? please help

Upvotes: 0

Views: 1062

Answers (2)

Papergrave
Papergrave

Reputation: 26

Yep if you have automatically declare stage instances unchecked you will get that error. It is a good practice to declare everything in AS3 and not rely on the GUI to do it. Even if it is

Public var boringBackground:Sprite;

It will pay off in the end performance and coding wise.

Upvotes: 1

Atriace
Atriace

Reputation: 2558

MovieClip is a dynamic object, whereas Sprite or Stage are not. With these classes, unless the property is explicitly defined, the compiler will complain about the absence of the property when you try to reference it.

If you're programming with Flash IDE, "Automatically Declare stage Instances" will create properties on your stage that make dot.notation pathing possible.

enter image description here

If you're creating objects dynamically, you'll have to either create the properties yourself (which is impossible with static classes like Sprite), or reference them by DisplayList fetching methods getChildAt() or getChildByName().

In the case of a class, unless you extend a class that is already a DisplayObject, you won't inherently have access to stage or root. You'd have to pass a reference to the MainTimeline or Stage manually (probably during instantiation). Even if you did extend a DisplayObject, you'd have to first parent the object to the stage; until then, the properties are null.

For the sake of argument, let's assume Player class is extending Sprite, and you have parented it to the stage. Your code would correctly be written as follows:

function checkCollision(e:Event) {
    if (this.hitTestObject(this.root.getChildByName("wall"))) {
        trace("HIT");
    } else {
        trace("MISS");
    }
}

Notice that the call to "wall" is not on the Stage. That's because there is only one child of stage, and that's MainTimeline (a.k.a. root).

BTW, you had an extra close brace in you example.

Upvotes: 1

Related Questions