AS3仕様へのリファイン
ヒマ時間での合間作業。
FlashCS3 + ActionScript3.0環境へのバージョンチェンジにあたり、いくつかの機能見直しを行う。
- SWFObjectを導入
http://blog.deconcept.com/swfobject/
HTMLへの埋め込みに、SWFObjectを採用する。これにより、埋め込みスクリプトの記述を簡略化、効率的なFlashVarsの送信を期待できる。
- クラスの役割分担の見直し
細かい部分でごちゃごちゃになっているので、表示系と処理系をなるべく差別化できるように。
- AS3移行に伴い、以前のバージョンとの互換性
FlashCS3から大きく仕様変更されたので、過去のバージョンで作られたswfは直接の互換性が無い。(AVM1Movieという型で認識される)
対応策として、LocalConnectionを使う。
ゲーム製作者は、Flash8以前の環境で外部ファイルをオーサリングする場合は下記のようなスクリプトを頭に記述する。
var conect:LocalConnection = new LocalConnection();
//conect.allowDomain('*');
conect.connect('_PrototypeConnectName');
/**
* ユニークなコネクション名を決める手続き。
*
* @param realName :swfAdvから来るユニークネーム
*/
conect.onConnectionName = function(realName:String)
{
conect.close();
conect.connect(realName);
}
/*
* 製作者の追加メソッド
*/
conect.hogehoge= function()
{
//てきとうに書く
}
21:10 追記
LocalConnectionで送信した後、相手側が受信したかどうかを監視するイベントが見つからなかったので、とりあえず接続名は読み込み側で決めることにした。
キャラクターファイルの例
var swfadvconnect:LocalConnection = new LocalConnection();
var date:Date = new Date();
var date_str:String = (String(date.getFullYear())
+ String(date.getMonth())
+ String(date.getDate())
+ String(date.getHours())
+ String(date.getSeconds()));
var realName:String = "_maidConnectionName" +date_str; // 接続名
swfadvconnect.connect(realName);
try{ swfadvconnect.send("_PrototypeConnectName", "onConnectionName", realName); }
catch (e:Error){ }
var _this = this;
swfadvconnect.expression = function(name:String)
{
_this.gotoAndStop(name);
}
swfadvconnect.lip = function(flag:Boolean)
{
if(flag){ _this.expression.mouth.play(); }
else{ _this.expression.mouth.gotoAndStop(1); }
};
何故ユニーク名を再設定する必要があるかというと、LocalConnectionは他の貼り付けFlashや他のウインドウのFlashに対しても送信してしまうため。多窓でswfAdvを展開していた場合誤動作を起こす可能性がかなり高い。
よって文字列+日付時間などでダブりそうもない接続名を動的に生成するのがベターなのだ、ということみたい。
かなり難解なスクリプトを書かせてしまうので、ここもクラスにした方がいいかもしれない。
本当はキャラクターファイル作成にもテンプレートクラスを用意して使うのがまっとうな手段なのだが、デザイナーさんに「クラス割り当て」と言われても?な場合が殆どなので、自由度が無いけどわかりやすい手段にしたかったのだが・・・。
FlashCS3ならこれまでと同じ感覚で作れるが、実際問題、絵描く程度なら8のままでも不自由が無い。その8で面倒起こしてしまうのなら、いっそのことロジックしやすい方向にしてしまうべきだろうか。