Flash/ActionScript3.0

2008年12月 9日 (火)

AS3:今更だけど、便利サイトメモ書き

Flashを今まで使ったことがなかった超初心者の私が、ActionScript3.0を勉強する上でとても参考にさせていただいたサイトです。

pencilAdobeのFlashデベロッパーセンター
クイックスタートをよく読めば、基本が押さえられます。

pencilAdobe Flash CS3 ドキュメンテーション
Flash CS3のヘルプのWeb版。ヘルプと内容は同じ。

pencilFLASH-japan
Flashに関するコミュニティサイト。ActionScript3.0特設会議室は便利。

pencilActionScript3.0のwiki(PUWIKI)
よくまとまってるし、サンプルも付いててわかりやすいです。

【個人ブログ】
penciltrick7.com blog

pencilActionScript3.0 勉強部屋

pencilmoriblog

pencilpyro blog

2008年5月16日 (金)

FlashをHtmlに埋め込んでみる

Yahoo!のポータルの右上にあるFlash広告のような感じで、FlashをHtmlに埋め込んでみたいなーと思って、調べてみた。
するとどうやら、

"swfobject.js"

と呼ばれる、jQueryと同じようにjavascriptのクラスのようなものを使うと簡単にできるらしい。
ちなみにjQueryとは。
http://allabout.co.jp/internet/javascript/closeup/CU20071020A/


というわけで、いろんなブログを参考にしつつ、使ってみました。
参考:
【お手軽にSWFObjectでswfを埋め込む方法】
http://www.trick7.com/blog/2006/09/12-165342.php

【SWFObjectを使ったFlashの埋め込み方法】
http://www.e-ssp.net/how_to_03.html

まずは"swfobject.js"をダウンロード。
↓のサイトから。
http://blog.deconcept.com/swfobject/
(英語ですわ・・・)
Downloadメニューから、"SWFObject 1.5"をダウンロードしてください。

ダウンロードした"swfobject.zip"を解凍すると、
"swfobject1-5"というフォルダができます。
その中の"swfobject.js"を使います。

あとはhtmlに書き込むだけ!

1.<head>〜</head>にこいつを書く

-------------------------------------------------
<script type="text/javascript" src="swfobject.js"></script>
-------------------------------------------------

2.<body></body>の好きな場所に以下を書き込み
ここではid="movie"のブロック要素の中にswfファイルを埋め込んでます。

-------------------------------------------------
<div id="movie">
    <!-- FlashPlayerが無い場合の代替画像↓ -->
    <img src="Image/test.jpg" alt="代替画像" />
    <!-- swfファイルの埋め込み↓ -->
    <script type="text/javascript">
        var so = new SWFObject("Image/test.swf", "TEST_MOVIE", "300", "250", "9", "#FFFFFF");
        so.write("movie");
    </script>
</div>
-------------------------------------------------

そして解説。
var so = new SWFObject("swfファイルのパス", "オブジェクトやembedタグのID(任意)", "幅(px)", "高さ(px)", "FlashPlayerのバージョン", "背景色");
so.write("ブロック要素のID");

これでOK。
・・・なんて簡単な・・・!
使いこなせばもっと便利になりそうです。

2008年4月30日 (水)

AS3:サウンドのフェードアウト

Flashで再生している音楽をフェードアウトさせる方法。
これまた独学ですが。
とりあえず上手くいったので、メモメモ。

-----------------------------------------------------------------------------------

【音楽を再生する最初のフレーム】

var snd:Sound = new Sound(new URLRequest("BGM.mp3"));
var trans:SoundTransform = new SoundTransform(0.5, 0); //音量、左右バランス(0:中心、-1:左、1:右)
var snd_channel:SoundChannel = snd.play(0,0,trans); //再生開始位置、再生回数、SoundTransfrom

-----------------------------------------------------------------------------------


【フェードアウトを始めたいフレーム】

//BGMのフェードアウト
this.stage.addEventListener(Event.ENTER_FRAME, FadeOut);
function FadeOut(event:Event):void {
    var i:Number = trans.volume;
    if (i > 0) {
        i = i - 0.05; //ボリュームを0.05減らす
        trans.volume = i;
        snd_channel.soundTransform = trans;
    }
    else {
        this.stage.removeEventListener(Event.ENTER_FRAME, FadeOut);
    }
}

-----------------------------------------------------------------------------------

もっと、ボリュームを減らす値を減らしたほうが(0.01くらい?)、綺麗にフェードアウトされそう。
好みに合わせて調節してください〜。

2008年4月24日 (木)

AS3:ムービークリップをぼかしてみる

Flash広告で、よく見かけるぼかしながら消えたり、現れたりするエフェクト。
ムービークリップのアルファ値を変える方法は、ただ薄くなった感じがするので、どうやったらぼかした感じに消えたり現れたりするのか調べてみた。

ぼかすエフェクトを使うには、ActionScriptで"BlurFilter"クラスを使う。
ENTER_FRAMEのタイミングでBlurFilterの水平方向と垂直方向のぼかしの量を調節すれば、ぼかしエフェクトができる!
BlurFilterクラスのプロパティ、blurX(水平方向のぼかし値)、blurY(垂直方向のぼかし値)を指定する。
指定できる値は" 0 〜 255 "で、"0"だとぼかし無しになり、"255"だとぼかし最大(つまり見えなくなる)

そこから、こんなスクリプトを作ってみた。
BFというムービークリップをぼかしながら表示させるというモノ。
----------------------------------------------------------

//初期値
var blur:BlurFilter = new BlurFilter();
blur.blurX = 80;//水平方向のぼかし
blur.blurY = 80;//垂直方向のぼかし
var i:uint = 80;//ぼかしの最大値
blur.quality = BitmapFilterQuality.MEDIUM;
//ぼかしたい対象のオブジェクト("BF")にぼかしの初期値を設定。
this.BF.filters = [blur];

//フレームが進むごとにぼかしを取っていく
this.addEventListener(Event.ENTER_FRAME, BlurImage);

function BlurImage(event:Event):void {
       blur.blurX = i;
       blur.blurY = i;
       this.BF.filters = [blur];
       if (i == 0) {
             this.removeEventListener(Event.ENTER_FRAME, BlurImage);
       }
       i = i - 2;//1フレームあたりどれだけ減らすかはお好みで。
}

------------------------------------------------------------------

こんな感じですわ。
ぼかしの初期値は80よりか100くらいでもほとんど見えない感じになるかも。

2008年4月15日 (火)

AS3:タイムライン埋め込みサウンドの制御方法

タイムラインに埋め込んだサウンドを制御してみようと四苦八苦した。

ボタンを押して、シーンが変わるとサウンドを切り替えたいのですが・・・
ただ埋め込んだだけだと、プロパティのサウンドの"同期"が「イベント」に設定されています。

Urztuina_s

※"同期:"と書かれている部分。

公式のヘルプによると・・・
イベント
イベントの発生にサウンドが同期します。
イベントサウンド (たとえば、ユーザーがボタンをクリックすると再生されるサウンド) は、イベントの開始キーフレームが最初に表示されたときに開始され、タイムラインとは関係なく、SWF ファイルの再生が停止したとしても、最後まで再生されます。
イベントサウンドは、パブリッシュした SWF ファイルを再生するときにミキシングされます。
イベントサウンドの再生中にサウンドが再度インスタンス化された場合 (たとえばユーザーがもう一度ボタンをクリックした場合)、サウンドの最初のインスタンスの再生は続けられ、同時にもう1つのインスタンスの再生が開始されます。

スタート
[イベント] オプションとほぼ同じですが、サウンドを既に再生している場合、そのサウンドの新しいインスタンスは再生されない点が異なります。

ストップ(停止)
指定したサウンドを停止します。

ストリーミング
Webサイトでの再生用にサウンドが同期化されます。Flash では、アニメーションを強制的にストリーミングサウンドに同期させておきます。
アニメーションのフレームをすばやく描画できない場合は、フレームがスキップされます。
イベントサウンドとは異なり、SWF ファイルの再生が停止するとストリーミングサウンドも停止します。
また、ストリーミングサウンドがそのフレームの時間を超えて再生されることはありません。
ストリーミングサウンドは、SWF ファイルをパブリッシュするときにミキシングされます。

だってさ。
「イベント」だと、ムービーを終了しても音楽は全て再生するまで流れ続けると。
だからといって、「ストリーミング」にすると、音質が悪くなったので、これはどうしたものか。

で、考えたのが、タイムライン上のサウンドは「停止」に設定しておいて、ActionScriptで制御する方法。

どうやるかというと、

1.まず、タイムラインにサウンドを埋め込み、同期を「停止」にする
レイヤー16にサウンドを埋め込み。
Icnyi04r

同期:「停止」にする。
Urztuina_s

2.ライブラリパネルのにある、追加したサウンドを選択して右クリックして、「リンケージ」を選択
Bacqehdq
Y9slvcil

4.サウンド再生のActionScriptを再生を開始したい任意の場所に書き込む
Jhosrzkr_s

var snd:begin = new begin;
var trans:SoundTrasform = new SoundTransform(1,0);//(音量、左右バランス[0:中心、-1:左、1:右])
var snd_channel:SoundChannel;

//サウンド再生開始
snd_channel = snd.play(0,0,trans);//再生開始位置、再生回数、SoundTransform

これでおしまい!

・・・ここまでたどり着くのにどんだけかかったことかsweat01
とにかく、上手くいけて良かった・・・orz

2008年3月17日 (月)

AS3:消えるボタンイベント

例えばsample.flaを作って、シーンを3つ作ってみる。
シーン1
シーン2
シーン3
というように。

そしてシーン1〜3にそれぞれ赤いボタンを配置して、
シーン1に、
addEventListenerでボタンイベントを追加。

----------------------------------------------------------------
this.btn_Red.addEventListener(MouseEvent.CLICK,RedButtonEvent);
function RedButtonEvent(event:MouseEvent):void {
  this.nextScene();//次のシーンへ移る
  this.gotoAndPlay(1);//1フレーム目から再生
}
----------------------------------------------------------------

そして実行すると・・・
シーン1は何事もなくシーン2へ移行。
でもシーン2からは、ボタンがうんともすんとも。
試しに、各シーンに以下のメソッドを追加してみた。

----------------------------------------------------------------
ButtonHasEvent();//←シーン2と3はこの1行だけ
//シーン1だけ記述↓↓
function ButtonHasEvent():void {
  if (this.btn_Red.hasEventListener(MouseEvent.CLICK)) {
    trace(this.currentScene.name +":赤ボタンイベントあり");
  } else {
    trace(this.currentScene.name +":赤ボタンイベントなし");
  }
}
----------------------------------------------------------------

で、実行して、赤ボタンを押した出力結果↓
----------------------------------------------------------------
シーン1:赤ボタンイベントあり
シーン2:赤ボタンイベントなし
----------------------------------------------------------------

・・・なるほど。
念のため、外部ファイルでボタンイベントを追加した場合もどうなるのか調べてみた。
(test.ButtonCon.as:青いボタンのイベント作成)

----------------------------------------------------------------
package test{
  import flash.display.*;
  import flash.events.*;
  public class ButtonCon {

    var _mc:MovieClip;

    function ButtonCon(mc:MovieClip):void {
      _mc = mc;
      //青ボタンイベント追加
      _mc.btn_Blue.addEventListener(MouseEvent.CLICK,BlueButtonEvent);
    }
    private function BlueButtonEvent(event:MouseEvent):void {
      if (_mc.currentScene.name == "シーン 1") {
        _mc.gotoAndPlay(1,"シーン 3");//一番前の場合は1番最後のシーンに移る
      } else {
        _mc.prevScene();//前に戻る
        _mc.gotoAndPlay(1);
      }
    }
  }
}
----------------------------------------------------------------
sample.flaの各シーンに青いボタンを追加して・・・、スクリプトをガリガリ修正。

(sample.flaのシーン1、1フレーム目に以下を追加)
----------------------------------------------------------------
import test.ButtonCon;
var btnCon:ButtonCon = new ButtonCon(this);
----------------------------------------------------------------

で、ButtonHasEvent()の出力メッセージに青ボタンも追加してからまた実行。
青ボタンを押してみる。

出力結果↓
----------------------------------------------------------------
シーン 1:赤ボタンイベントあり
シーン 1:青ボタンイベントあり
シーン 3:赤ボタンイベントなし
シーン 3:青ボタンイベントなし
----------------------------------------------------------------

・・・ほほう、なんてこったい。
複数シーンにあるボタンに同じ機能を付けたい場合は、気をつけないと。
ボタンイベントを作っても、設定したシーン内でしか有効でないと・・・

シーンが遷移したときに、もう一度設定しなおす必要があるのね。
普通の関数(上で言うところの"ButtonHasEvent()"メソッド)は、flaファイル内で1回つくっておけば、シーンをまたいでも呼び出すことができる(ただし、呼び出せるのは書き込んだ以降のフレームorシーン)のにね・・・

う・・・ややこしい・・・
こういうときにクラスを使うと上手くいくのかもしれない。
ボタンイベントを作るクラスを作って、シーンが変わるたびにそのクラスの関数を呼びだすと。
そういえば、同一flaファイル内でも、シーンが変われば同じインスタンス名が設定できる時点でわかっておくべきでした・・・orz

2008年2月 5日 (火)

AS3:キーボードイベントの罠

Flashのとある画面(フレーム)上に配置したボタンと同じ動作を、
Enterキーを押したときにも出来る様にしようとしたら↓

//----------------------------------------------------------
import flash.display.*;
import flash.events.*;
import flash.ui.Keyboard;

this.stop();

//"次へ"ボタンクリック
function btnNext_onClick(event:MouseEvent):void {
    Next_Movie();
}
this.btnNext.addEventListener(MouseEvent.CLICK,btnNext_onClick);

//Enterキーでも次へ進む
function Press_EnterKey(event:KeyboardEvent):void {
    if (event.keyCode == Keyboard.ENTER) {
         Next_Movie();
    }
}
this.addEventListener(KeyboardEvent.KEY_DOWN,Press_EnterKey);

//次のシーンに遷移する
function Next_Movie():void {
    //"2番目のシーン"の1フレーム目から再生
     this.gotoAndPlay(1,"2番目のシーン");
    //キーボードのイベントリスナーを削除
    removeEventListener(KeyboardEvent.KEY_DOWN,Press_EnterKey);
}

//----------------------------------------------------------
これだけだと、なぜかボタンイベントしか動作しない。
ムムム・・・何でだ!!
と、色々調べてみた。
アドビのActionScript 3.0 コンポーネントリファレンスガイドにとんでもないことが書かれていた。
KeyboadEventについて
このページの一番下の例にはっきりと。

   一部のインスタンスでは、ステージをクリックしないと、キーボードイベントが実行されない場合があります。

・・・な、なんですと!?
で、例にも

stage.focus = child;

なんて書いてあった。
普通に実行(再生)しただけだと、ムービークリップインスタンスにフォーカスが当たらないのね・・・
明記する必要があるのね・・・
というわけで、書き足し。

//----------------------------------------------------------
import flash.display.*;
import flash.events.*;
import flash.ui.Keyboard;

this.stop();
this.focusRect = false; //オブジェクトにフォーカスが当たったときに、矩形を描画しない
this.stage.focus = this; //thisにフォーカス

//"次へ"ボタンクリック
function btnNext_onClick(event:MouseEvent):void {
    Next_Movie();
}
this.btnNext.addEventListener(MouseEvent.CLICK,btnNext_onClick);

//Enterキーでも次へ進む
function Press_EnterKey(event:KeyboardEvent):void {
    if (event.keyCode == Keyboard.ENTER) {
        Next_Movie();
    }
}
this.addEventListener(KeyboardEvent.KEY_DOWN,Press_EnterKey);

//次のシーンに遷移する
function Next_Movie():void {
    //"2番目のシーン"の1フレーム目から再生
    this.gotoAndPlay(1,"2番目のシーン");
    //キーボードのイベントリスナーを削除
    removeEventListener(KeyboardEvent.KEY_DOWN,Press_EnterKey);
}

//----------------------------------------------------------
ふぅ・・・これでようやく思ったとおりの動作が出来るようになりました。
先週から悩んでたもんでスッキリ!

AS3:AS外部ファイルの使い方(クラスの作成)

言い訳なのですが・・・
私、ついこの間まで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; //"メニューへ戻る"ボタンを非表示
        }
    }
}



//--------------------------------------------------

余計長くなった・・・
えぇ、ダメダメなコーディングなのはわかっていますとも。
・・・勉強しなくっちゃ・・・

2008年1月25日 (金)

AS3:シーンが遷移しないぞ・・・(解決編)

でけたでけた。
デバッグしてみると、
mc.addEventListener(Event.ENTER_FRAME,GotoMenu);
が永久ループしてた。
ENTER_FRAMEって、再生ヘッドが新しいフレームに入るときに送出されるイベントなんだけど、
子オブジェクトで
stop();(再生の停止)
をしても、ENTER_FRAMEは発生するようです・・・

というわけで、イベントリスナーを消さないとだめなのね。
最終フレームに再生ヘッドが来た時に、イベントリスナーをremoveすると、上手くいきました。

以下、親オブジェクト(呼び出し画面)に書いたスクリプト。

---------------------------------------------------------------
import flash.events.MouseEvent;
import flash.display.MovieClip;

this.stop();

//子オブジェクト生成、呼び出し
var request:URLRequest = new URLRequest("SAMPLE.swf");
var loader:Loader = new Loader();
loader.load(request);
addChild(loader);

var mc:MovieClip = new MovieClip();

//子オブジェクトロード完了
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, Start_Movie);
function Start_Movie(event:Event):void {
//子オブジェクト再生中の処理
mc = MovieClip(loader.content);
mc.addEventListener(Event.ENTER_FRAME,GotoMenu);
}

//再生が終了すれば、自動的にメニュー画面に戻る
function GotoMenu(event:Event):void {
if (mc != null) {
//最終シーン
if (mc.currentScene.name == "SWF_END") {
//最終フレーム到達時
if (mc.currentLabel == "Final") {
//メニューへ戻る
Play_Menu();
}
}
}
}

//メニューへ戻るボタン
this.btnGotoMenu.addEventListener(MouseEvent.CLICK,btnGotoMenu_onClick);
function btnGotoMenu_onClick(event:MouseEvent):void {
Play_Menu();
}

//メニューへ戻る関数
function Play_Menu() {
mc.visible = false;
this.gotoAndPlay(1, "Menu");
this.btnGotoMenu.visible = false;
//イベントリスナー削除
mc.removeEventListener(Event.ENTER_FRAME,GotoMenu);
}

------------------------------------------------------

これで、親画面で子画面を操作できるようになりましたわ・・・
長かった・・・

2008年1月24日 (木)

AS3:シーン遷移しないぞ・・・?(未解決)

「Menu」シーンにあるボタンを押すと、別シーンが呼び出されて、別シーンで外部ファイル(.swfファイル)を呼び出して再生させるというFlashを作ってます。

でも問題が・・・

外部ファイルの再生が終了したら自動的にメニュー画面に戻りたいのに、なぜかできません・・・

---------------------------------------------------------------

this.stop();

//外部ファイル呼び出し、再生
var request1:URLRequest = new URLRequest("test.swf");
var loader1:Loader = new Loader();
loader1.load(request1);
addChild(loader1);

//外部ファイルロード完了
loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, Start_Movie);
function Start_Movie(event:Event):void {
//外部ファイルの再生が終了したらメニューへ戻る
MovieClip(loader1.content).addEventListener(Event.ENTER_FRAME,GotoMenu);
}

function GotoMenu(event:Event):void {
if (MovieClip(loader1.content) != null) {
var scene1:Scene = MovieClip(loader1.content).currentScene;
//最後のシーン
if (scene1.name == "SWF_END") {
//最後のフレームならメニューへ戻る
if (MovieClip(loader1.content).currentLabel == "Final") {
Play_Menu();
}
}
}
}

//メニューへ戻るボタン
this.btnGotoMenu1.addEventListener(MouseEvent.CLICK,btnGotoMenu1_onClick);
function btnGotoMenu1_onClick(event:MouseEvent):void {
Play_Menu();
}

//メニューへ戻る関数
function Play_Menu() {
MovieClip(loader1.content).visible = false;
this.gotoAndPlay(1, "Menu");
this.btnGotoMenu1.visible = false;
}

-------------------------------------------------------------------------------

「メニューへ戻る」ボタンを押すとちゃんと「Menu」シーンに戻って1から再生してくれるのに、
なんで自動でできないんだろう・・・

明日も悩む予定shock

2008年1月18日 (金)

FlashをHTMLで再生するとエラー!?

Uixhurpx
flashで作ったファイル(.swf)をHTML上で見れるようにしたんだけど・・・
なぜか、上のようなエラーが出たcoldsweats02

.swfファイル単体で再生したらちゃんと出来るのに・・・ナゼだ!!!!?
と困ってしまって、色々調べていたら↓に載ってるようなことが原因だったらしい。

http://www.pyro.jp/blog/2008/01/flashdevelop.html

すなわち、
Adobe Flash CS3 Professionalでいうところの、

メニューバー>「制御」の
・ムービープレビュー
・シーンプレビュー
または
メニューバー>「デバッグ」の
・ムービーのデバッグ

で再生するときに作られる.swfファイルはデバッグ版。

リリース版の.swfファイルはパブリッシュすることで作成することができるのね。

・・・デバッグとかリリースとか、Flashにもあるのか・・・(ヲイ

パブリッシュできていなかった動画をパブリッシュしたらうまくいきました。
これからは気をつけよう・・

2007年12月21日 (金)

ActionScript3.0は手ごわい

えー・・・

全くの初心者なのにFlashでパワポっぽいモノを作れといわれました・・・
しかも2週間で。

・・・どうしようorz

アニメーション自体は2回ほど作った経験があるんだけど、1枚ものだし。
いきなりそんな高度なものを求められてもねぇ(涙)

動画は結構すんなりといけたんだけど、曲者なのはFlashで使われる「ActionScript3.0」というもの。
こいつを使うとボタンイベントとか、外部ファイル呼び出しとかしてくれるんだけど、全く使い方がわからない・・・

なんかC#やJavaと似てるから「いけるかも?」と思ってたのに、結構融通が利きませんcoldsweats02

ボタンをクリックして、別シーンを呼び出すのに何時間かかっとんねん。
これは、明日にでもActionScript3.0の本を買ってこなきゃ始まらんな・・・

あかん、ぜんぜんわからん。
でもFlashを2週間でマスターできたら・・・いいよね・・・
フォトアルバム

2012年5月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

My Photostream

  • Flickrにアップしてる写真の一部です。
    www.flickr.com
    This is a Flickr badge showing public photos and videos from micek_flicek. Make your own badge here.

クリック募金

  • クリックで救える命がある。
Powered by Six Apart