user3052587
user3052587

Reputation: 33

Flash AS3 - Trying to access public function from another class throws error?

This is my Main.as:

package {
    import flash.display.MovieClip;
    public class Main extends MovieClip {
        public function Main() {
           // Code here
        }

        public function myFunc() {
            trace('!!!!');
        }
    }
}

When I try accessing it from another class using the following code, Flash throws me Error #2136:

package {
    import flash.display.MovieClip;
    import Main;

    public class MyClass extends MovieClip {
        public var m:Main;

        public function MyClass() {
            m = new Main();
            m.myFunc();
        }
    }
}

EDIT: One more thing. The second class is attached to a MovieClip and exported on the first frame. I thought it made no difference, but someone in the comments have told me it does and apparently that's what's causing the error in the first place. In that case, how can I access the public function from a class attached to a MC?

Upvotes: 0

Views: 82

Answers (1)

Aaron Beall
Aaron Beall

Reputation: 52133

Next time post the error message itself, most of us do not have Flash errors memorized by id. ;)

From the docs:

2136 The SWF file %1 contains invalid data.

This rings a bell for me. Your Main class is probably your document class. The document class is a special class that cannot be instantiated.


To access properties and methods of the document class instance from other code, you simply need a reference to the document class instance.

There are many ways you could get a reference, as it is really just a code dependency design question. Two common, easy solutions are:

1. Use the root property of any display object that is added as a child of the document class instance. Since the root property is typed to DisplayObject you need to cast to your document class to access its methods and property, for example: Main(root).myFunc().

2. Use the singleton pattern and assign a static public reference to the document class instance:

public class Main {
    public static var main:Main;
    public function Main() {
        main = this;
    }
    public function myFunc():void { }
}

// usage:
Main.main.myFunc();

Upvotes: 1

Related Questions