FlashDevelop+AS3でクラスを作成する
プロジェクトの作成
Project>New ProjectからAS3 projectを選択
Mainクラスの作成
必須です。プロジェクトを作成すると自動生成されています。
package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point } } }
mainクラスをシンプルにすると下のようになります。
package { import flash.display.Sprite; public class Main extends Sprite { public function Main():void { // entry point } } }
クラスの追加
プロジェクトツリーで右クリック→Add > New Class...で追加できます。ここでは単に文字をコンソールに表示するだけのSampleクラスを作成してみます。
package { import flash.display.Sprite; public class Sample { public function Sample():void { trace("Sample") } public function func():void { trace("func") } } }
Sampleクラスをmainに追加する方法です。
クラスのメンバとして追加する方法
package { import flash.display.Sprite; public class Main extends Sprite { private var sample:Sample; public function Main():void { // ここでインスタンス生成 sample = new Sample(); } } }
このように宣言するとMainクラス内であればsampleにアクセスすることができます。
次のようにメンバ変数の宣言と同時にインスタンスを生成することもできます。
package { import flash.display.Sprite; public class Main extends Sprite { private var sample:Sample= new Sample(); public function Main():void { sample.func(); init(); } public function init():void { sample.func(); } } }
Sample
func
func
一時オブジェクトとしてインスタンスを生成する方法
package { import flash.display.Sprite; public class Main extends Sprite { public function Main():void { // ここでインスタンス生成 var sample:Sample = new Sample(); } } }
Main()メソッド内でのみsampleを利用できます。
インスタンスが破棄されるタイミング
次のように、初期化の際に一時的にインスタンス化してみます。
あとで別のメソッド内で同じインスタンスを呼び出すとコンパイルエラーになってしまいます。
package { import flash.display.Sprite; public class Main extends Sprite { public function Main():void { var sample:Sample = new Sample(); init(); } public function init():void { sample.func();//15行目 } } }
インスタンスsampleはMain()関数が終了すると同時に破棄されているようです。そのため、別の関数で利用するならもう一度サンプルクラスをインスタンス化しなければなりません。
[Fault] exception, information=TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
Fault, init() at Main.as:15
package { import flash.display.Sprite; public class Main extends Sprite { public function Main():void { var sample:Sample = new Sample(); init(); } public function init():void { var sample:Sample = new Sample(); sample.func(); } } }
if文の中でインスタンス化した場合はどうでしょうか?次の例では、コンパイルが通ります。for文などでも同様です。
package { import flash.display.Sprite; public class Main extends Sprite { private var sample:Sample; public function Main():void { if (1) { var sample:Sample = new Sample(); } sample.func(); } } }
同じMain()関数内ではまだsampleは破棄されていないのでメンバfunc()を呼び出せます。インスタンスが破棄されるのは、newを呼び出したメソッドが処理を終えたときのようです。
Sample
func
エントリーポイントの変更
エントリーポイントとはプログラムが実行されて初めて呼び出される箇所のことです。プロジェクトにTest1.asとTest2.asだけ用意してみます。
Test1.asで右クリック→Always CompileにするとエントリーポイントがTest1()になります。このときTest2は呼び出されません。
逆にTest2.asをAlways CompileにするとTest2が最初に実行されるようです。両方ともAlways Compile、エントリーポイントにすることはできない仕組みになっているようです。
Test1.as
package { import flash.display.Sprite; public class Test1 extends Sprite { public function Test1():void { trace("Test1") } } }
Test2.as
package { import flash.display.Sprite; public class Test2 extends Sprite { public function Test2() { trace("Test2") } } }