言い訳なのですが・・・
私、ついこの間までFlashはほとんど触ったことない未経験者。
なのにいきなり業務で「Flash作って♪」って言われてしまいました・・・
初Flash&初ActionScript3.0な上、しかも職場にはFlash使いがおらず・・・全部独学。
なのに!
多くのFlash関連サイトで調べても超初心者には何が書かれてあるかすらわからない・・・(泣)
しかもActionScript3.0関連の情報が少ない(追い討ち)
コーディングの暗黙の了解なんて知りませんよ・・・><
AS3のASファイル(外部ActionScriptファイル)の使い方、理解するのに苦労しましたorz
もしかしたら使い方が間違っているのかもしれませんが、とりあえず、メモ。
参考は
Flashクイックスタート:ActionScript 3.0を使用したプログラミング:
簡単なActionScript 3.0クラスの作成
ActionScript 3.0で始めるオブジェクト指向スクリプティング1.ASファイルの置き場所に注意!
クラスを作成するときに"package {}"でくくるんだけど、
"package"だけ書くと、ASファイルを呼び出す.flaファイルと同じディレクトリ階層に置かないとダメ。
ASファイルを別フォルダに格納して、.flaファイルと別階層になってしまうと、うまく呼んできてくれません。
例えば、
package com.example.quickstart {
public class testClass
{
・・・
}
}
と書いた場合の、ASファイルの置き方は、
━ test.fla
┗ com ━ example ━ quickstart ━ testClass.as
になります。
・・・知らんかった・・・(てか、クイックスタートページに書いてたわ・・・orz)
2.ASファイルには、1つのパッケージ、1つのクラスが基本!
パッケージの内容には1つのclassステートメントと、すべての必要なimportステートメントを書きます。
1つのパッケージの中に2つ以上のクラスは書いちゃダメ。
それに、"package"は同じファイルに2つ以上書いちゃダメ。
2つ書くとエラーになります。
クラスごとにASファイルが必要なのか。(へぇ)
あ、
パッケージ外クラス、できるみたい。
3.作ったクラスを使うには、.flaファイルに"import"!
がりがり書いたASファイルを使えるようにするには、.flaファイルの任意フレームのアクションパネルに
import com.example.quickstart.testClass(import + パッケージの場所 + クラス名)
と書いてしまえば、独自クラスが使えるようになります。
というわけでサンプル↓。
"LoadMovie"と"BacktoMenu"が独自クラスです。
//--------------------------------------------------
【呼び出し元のtest.fla】
import flash.events.MouseEvent;
import flash.display.MovieClip;
import LoadMovie; //外部.swfファイルを呼んでくるクラス
import BacktoMenu; //メニュー画面に戻るクラス
this.stop();
//"LoadMovie"クラスのインスタンスを作成して変数に格納
var LoadMovie1:LoadMovie = new LoadMovie(this, "Sample.swf");//"BacktoMenu"クラスのインスタンスを作成して変数に格納
var BacktoMenu1:BacktoMenu = new BacktoMenu(this,this.btnGotoMenu1);//子オブジェクトを親オブジェクトに追加
var loader1:Loader = LoadMovie1.addChild_Loader();
var child_mc1:MovieClip;
var child_mc_End1:Boolean = false;
//子オブジェクトロード完了イベント
loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, Start_Movie1);
function Start_Movie1(event:Event):void {
//ローダ−をムービークリップに変換
child_mc1 = MovieClip(loader1.content);
//子オブジェクト再生中の処理
child_mc1.stage.addEventListener(Event.ENTER_FRAME,GotoMenu1);
function GotoMenu1(event:Event):void {
child_mc_End1 = BacktoMenu1.GotoMenu(child_mc1, "最終フレーム");
//最終フレームの処理
if (child_mc_End1 == true) {
//イベントリスナー削除
child_mc1.stage.removeEventListener(Event.ENTER_FRAME,GotoMenu);
}
}
}
//メニューへ戻るボタン
this.btnGotoMenu.addEventListener(MouseEvent.CLICK,btnGotoMenu_onClick);
function btnGotoMenu_onClick(event:MouseEvent):void {
BacktoMenu.Play_Menu(this, child_mc1, this.btnGotoMenu);
}
//--------------------------------------------------
【LoadMovie.as】
package
{
import flash.events.*;
import flash.display.*;
import flash.net.*;
//子画面呼び出しクラス
public class
LoadMovie extends MovieClip {
var _mc:MovieClip;
var _filename:String;
var _loader:Loader;
//コンストラクタ
function LoadMovie(m:MovieClip, mf:String):void {
_mc = m;//親オブジェクト
_filename = mf;//呼び出すswfファイル名
}
public function addChild_Loader():Loader {
//子オブジェクト生成、呼び出し
var req:URLRequest = new URLRequest(_filename);
_loader = new Loader();
_loader.load(req);
_mc.addChild(_loader);//子オブジェクトに追加
return _loader;
}
}
}
//--------------------------------------------------
【BacktoMenu.as】
package
{
import flash.events.*;
import flash.display.*;
//メニュー画面へ戻るクラス
public class
BacktoMenu extends MovieClip {
var _master_mc:MovieClip; //ムービークリップ(親:呼び出し元)
var _child_mc:MovieClip; //ムービークリップ(子:外部.swfファイル)
var _sScene_name:String; //最終シーン名格納
var _master_btn:SimpleButton; //"メニューへ戻る"ボタン(親)
var _bMovie_end:Boolean = false; //最終フレーム到達フラグ
//コンストラクタ
function BacktoMenu(m_mc:MovieClip,m_btn:SimpleButton):void {
_master_mc = m_mc;
_master_btn = m_btn;
return;
}
//再生が終了すれば、自動的にメニュー画面に戻る
public function GotoMenu(mc:MovieClip, sn:String):Boolean {
_sScene_name = sn;//最終シーン名
_child_mc = mc;
if (_child_mc != null) {
//最終シーン
if (_child_mc.currentScene.name == _sScene_name) {
//最終フレーム到達時
if (_child_mc.currentLabel == "Final") {
//メニューへ戻る
Play_Menu(_master_mc, _child_mc, _master_btn);
//最終フレーム到達フラグを"true"
_bMovie_end = true;
}
}
}
return _bMovie_end;
}
public function Play_Menu(m:MovieClip, c:MovieClip, m_button:SimpleButton):void {
c.visible = false; //再生中の子ムービークリップを非表示
m.gotoAndPlay(1, "Menu"); //"Menu"シーンへ戻る
m_button.visible = false; //"メニューへ戻る"ボタンを非表示
}
}
}
//--------------------------------------------------
余計長くなった・・・
えぇ、ダメダメなコーディングなのはわかっていますとも。
・・・勉強しなくっちゃ・・・