こんにちは、さいきん深夜のドライブが日課のkijimaです

Progressionで実装していると、どのシーンからも共通の変数にアクセスしたいことってでてきますよね。

以前twitter(otoyasumi)で「どのシーンからもアクセスできるようにはみんなどうしてるんかなー?」ってつぶやいてたらikedahidenoriさんが「データ保持用のクラスつくってSingletonパターンでアクセスしてます」と仰ってたので、それがラクそうだなと思って僕もその方法で実装してみました。

と、そのまえにSingletonパターンについて
たとえば、ユーザー登録してログインするFlashコンテンツでいうところのユーザーIDやニックネーム、あと各クラスで使いまわす共通するパラメーターがあったとします。
それらのパラメータを、各クラス内でそれぞれ書き換えたりすると、ほかのクラスから参照した場合などに古い値のままだったり、とバグの温床になってしまいます。

そこで、Singletonというクラスを作っておいてその中にパラメータを保持しておきましょう。ユーザーの操作などで書き換えたいときには、それぞれのクラス内で変数をいじるのではなく、いちいちSingletonクラスにアクセスするようにして、ひとつの場所にまとめることで上のようなバグを回避できます。参照・書き換えにはgetter/setter関数を使います。
ちなみに、ユーザーの操作で変更されない変数はstatic constで定義してます。

/* * Singleton.as */ package { public class Singleton { public static var _instance:Singleton; public static function get instance():Singleton { if ( _instance === null ) { _instance = new Singleton; } return _instance; } //Singletonクラス内で保持しておく値。参照、書き換えするとき直接いじらない private var _testID:String = "init"; //static constで定義しているので書き換えできない。予期せぬ間違いを防げる static const _url:String = "http://level0.kayac.com/" /* * ------------------------------------------------------- * getter setter関数を通して、_testIDの参照と書き換えを行う */ public function set testID(id:String):void{ _testID = id; trace("(_testIDを書き換え ->", _testID,")");//書き換えをしたタイミングでtraceだしてみる } public function get testID():String{ return _testID; } /* * ------------------------------------------------------- * getter関数でurlを参照する。書き換えはできない。 */ public function get url():String{ return _url; } } }

/* * Main.as */ package { import flash.display.Sprite; public class Main extends Sprite { private var singleton:Singleton public function Main():void{ singleton = Singleton.instance; trace("testID", singleton.testID);//getter関数で参照する singleton.testID = "0123456789";//setter関数で書き換える trace("testID", singleton.testID);//書き換えられたのを確認するためにgetter関数で参照する trace("url", singleton.url);//単純にgetter関数で参照する } } }


上のコードのSingleton.asを含んだサンプルファイルつくってみました。Main.flaのドキュメントクラスにMain.asを設定して、Main.asのコンストラクタ内でSingletonクラスのパラメータを参照、書き換えを行っています。
Singletonパターンの実装サンプル(flaつき、AS3)

Progressionでの実装時、各シーンから参照するには
上のコード(Main.as)のようにインスタンスを定義して、プロパティにアクセスするように参照、設定するだけです。Singletonパターンについて説明が足らなかったと思いますが、いろんな方がAS版に移植していたり解説していますのでググったりして調べてみてくださいw

KAYACでは、ASだけでなく他言語もイケる、バイリンガルなFlasherを募集しています!!


HTML5飯