ムービークリップオブジェクト

ムービークリップオブジェクトはFlashの基本となるオブジェクトです。Flashムービー自体をSWFファイルで書き出して、他のムービーにムービークリップシンボルとして使用することができます。

ムービークリップオブジェクトの特徴

ムービークリップオブジェクトの特徴として以下のものがあげられます。

  • タイムラインがある
  • インスタンス名がある
  • フレームアクション、ボタンアクション、ムービークリップアクションを記述できる

ムービークリップオブジェクトの生成

ムービークリップオブジェクトは以下のときに生成されます。

  • 配置したタイムライン上に再生ヘッドが来たとき
  • attachMovie()メソッドやduplicateMovie()メソッドが実行されたとき
  • loadMovie()メソッドでロードが完了しているとき

ムービークリップのプロパティ

個々のインスタンスの持つプロパティ

_x x座標
_y y座標
_height 高さ
_width 横幅
_xscale 横幅の拡大縮小率(%)
_yscale 縦幅の拡大縮小率(%)
_rotation 回転角度
_alpha インスタンスの透明度(%)
_visible 表示/非表示
_xmouse インスタンスから見たマウスのx座標
_ymouse インスタンスから見たマウスのy座標
_name インスタンス名
_parent 一つ上の階層のインスタンス
_root 大元のタイムライン
_target インスタンスのターゲットパス
_droptarget ドラッグ先のインスタンスのターゲットパス
_totalframes 総フレーム数
_currentframe 現在のフレーム番号
_framesloaded ロードが完了したフレーム番号
_level* 各レベルの大元のタイムライン(*は数字)
_url そのインスタンスがロードされたURL

例 右方向に進むムービークリップ

移動させたいムービークリップにムービークリップアクションをつけます。

onClipEvent(enterFrame) {
    this._x+=10;
}

クリップイベントループを使って_xの値を増やすことで右方向に移動します。

ムービークリップ全体のプロパティ

ムービー全体で一つの値となるプロパティ

_focusrect フォーカスがある場合の矩形表示のオン/オフ
_highquality ムービーのレンダリング品質の設定
_soundbuftime サウンドのストリーミングを開始するまでのバッファ秒数

ムービークリップオブジェクトのメソッド

stop() タイムラインの停止
play() タイムラインの再生
prevFrame() 一つ前のフレームにジャンプして停止
nextFrame() 次フレームにジャンプして停止
gotoAndPlay() 指定されたフレームにジャンプして再生
gotoAndStop() 指定されたフレームにジャンプして停止
getURL() URLをリクエストしてブラウザに表示
startDrag() ドラッグを開始
stopDrag() ドラッグの停止
setMask() ムービークリップを別のマスクとして指定
attachMovie() シンボルから新規のインスタンスを生成
createEmptyMovieClip() 空のムービークリップを生成
createTextField() 空のテキストフィールドを生成
duplicateMovieClip() インスタンスを複製
removeMovieClip() 生成したムービークリップインスタンスの消去
getDepth() 深度(Level)を取得
swapDepth() 深度(Level)の入れ替え
hitTest() 重なりを判定
getBounds() 座標の取得
globalToLocal() グローバル座標をローカル座標に変換
localToGlobal() ローカル座標からグローバル座標への変換
loadMovie() 外部SWFファイル/外部JPGファイルの読み込み
unloadMovie() loadMovie()で読み込まれたSWFを消去
getBytesLoaded() ムービークリップのロードされたバイト数を取得
getBytesTotal() ムービークリップのデータサイズの取得
loadVariables() 外部からの変数読み込み

ムービークリップの複製 duplicateMovieClip()

duplicateMovieClip()メソッドを使用してタイムライン上に存在するムービークリップの複製ができます。書式は以下のとおりです。

複製元のムービークリップインスタンス.duplicateMovieClip(複製後のインスタンス名, 深度)

グローバル関数として記述する場合には以下のようになります。

duplicateMovieClip(複製元のムービークリップインスタンス, 複製後のインスタンス名, 深度)

深度とは、オブジェクトの重なり順のことで、大きいものほど手前に表示されます。新しくムービークリップを作成する場合には、使用されていない数値を指定する必要があります。

複製したムービークリップは複製もとのムービークリップと同じプロパティの値を持ちます。

例 ムービークリップの複製

元のムービークリップのインスタンス名をa_mcとして、メインムービーに以下のフレームアクションを記述します。

for(i=0; i<10; i++) {
    a_mc.duplicateMovieClip("a"+i, i);
}

この例では複製を10個作成しています。複製したムービークリップは 同じ位置に複製されて重なってしまいます。

リンケージムービークリップの生成 attachMovieClip()

ライブラリに登録してあるムービークリップシンボルをattachMovie()メソッドを使用して生成することができます。書式は以下のとおりです。

付加するムービークリップインスタンス.attachMovie(シンボル識別子, 新規インスタンス名, 深度)

例 リンケージムービークリップの生成

  1. ライブラリから生成したいムービークリップシンボルを右クリックしてポップアップメニューから「リンケージ」を選択します。
  2. 「識別子」欄に名前をつけます。他のシンボルと識別子が重複しないようにします。ここでは「test」とつけます。
  3. 「ActionScriptに書き出し」にチェックをつけます。
  4. 「OK」ボタンを押します。
  5. 以下の書式にならい、アクションスクリプトを記述します。
    _root.attachMovieClip("test","test_mc",10);
    

この例ではステージ上(_root)に生成しています。

ムービークリップの削除 removeMovieClip()

duplicateMovieClip()メソッド、attachMovie()メソッドで 作成したムービークリップインスタンスはremoveMovieClip()メソッドを使用して削除できます。 書式は以下のとおりです。

削除するムービークリップインスタンス.removeMovieClip()

グローバル関数として記述する場合には、以下のようになります。

removeMovieClip(削除するムービークリップインスタンス)

ドラッグの開始

startDrag()メソッドでドラッグの開始ができます。書式は以下のとおりです。

ドラッグ対象のムービークリップインスタンス.startDrag(吸着の可否, 左, 上, 右, 下)

グローバル関数として記述する場合には、以下のようになります。

startDrag(ドラッグ対象のムービークリップインスタンス, 吸着の可否, 左, 上, 右, 下)

「吸着の可否」にTrueを指定するとマウスカーソルに吸着します。省略可能です。一度に一つのオブジェクトしか吸着はできません。他に吸着していたものは解除されます。

「左、上、右、下」は移動範囲を指定します。省略可能です。

例 オリジナルマウスポインタ

マウスポインタに使用したいムービークリップインスタンスに以下のムービークリップアクションをつけます。

onClipEvent(load) {
    Mouse.hide(); 
    this.startDrag(true);
}

Mouseオブジェクトのhide()メソッドで通常のマウスカーソルを消しています。

ドラッグの停止

stopDrag()メソッドでドラッグの停止ができます。書式は以下のとおりです。

ドラッグ対象のムービークリップインスタンス.stopDrag()

グローバル関数として記述する場合には、以下のようになります。

stopDrag(ドラッグ対象のムービークリップインスタンス)

衝突判定 hitTest()

hitTest()メソッドで衝突の判定ができます。以下の判定ができます。

  • ムービークリップとの衝突

    ムービークリップ同士の衝突判定を行います。判定はオブジェクトの形状に関わらず長方形で判定が行われます。

    ムービークリップインスタンス.hitTest(対象のムービークリップインスタンス)
  • 座標で衝突判定

    ムービークリップが指定の座標と重なっているかと判定します。「形状判定」は省略すると四角形で判定が行われ、trueを指定すると形状で判定が行われます。

    ムービークリップインスタンス.hitTest(x座標, y座標, 形状判定)

例 ムービークリップとの衝突

移動するオブジェクトball_mcを用意します。さらに適当なオブジェクトを作成して、以下のムービークリップアクションを記述します。

onClipEvent(enterFrame) {
    if ( this.hitTest(_parent.ball_mc) ) {
        rad=Math.atan2(_parent.ball_mc._y-this._y,_parent.ball_mc._x-this._x);
        _parent.ball_mc._rotation=rad*180/Math.PI;
        _parent.ball_mc.speed=20;
    }
}

ムービークリップball_mcとの衝突判定を行い、衝突した際には、

  • 速度を20に変更
  • ball_mcの角度を衝突した時の角度方向に変更

をしています。ピンボールのバンパーみたいなものですね。ほんとは位置も修正した方がいいのですが面倒なので…。^^;

衝突した際にremoveMovieClip()メソッドでオブジェクトを消すようにすれば、ブロック崩しのブロックが表現できますね。ただし、消すためには、dupulicateMovieClip()メソッドやattachMovieClip()メソッドを使用してオブジェクトを生成しておく必要があります。

外部のムービーや画像の読み込み loadMovie()

loadMovie()メソッドを使って外部のムービー(SWFファイル)や 画像(JPGファイル)を読み込むことができます。書式は以下のとうりです。

ムービークリップインスタンス.loadMovie(外部ファイルのURL)

グローバル関数として記述する場合には、以下のようになります。

loadMovie(外部ファイルのURL, 読み込み位置)

URLには、SWFファイルまたはJPGファイルのURLアドレスを指定します。読み込み位置には ムービークリップのインスタンス名またはドキュメントのレベル(_level0, _level1, ...)を指定します。

例 外部SWFファイル・外部JPGファイルの読み込み

test_mcムービークリップ(手動でもcreateEmptyMovieClip()でも可)に外部SWFファイル・外部JPGファイルを読み込みます。

test_mc.loadMovie("test.swf"); // 外部SWFファイルを読み込み

test_mc.loadMovie("test.jpg"); // 外部JPGファイルを読み込み

loadMovie()メソッドで外部ファイルを読み込んだ場合の注意

  • 読み込み後のターゲットインスタンスは、もとのファイルの大きさを現在のインスタンスの スケールで合わせた幅と高さになります。例えば、縦横のスケールが200であるインスタンスに、 200×120の大きさのファイルを読み込んだ場合には、400×240の大きさになります。
  • 外部ファイルをloadMovie()メソッドで読込むと、ターゲットインスタンスにスクリプトで設定したプロパティやメソッドなどはすべてクリアされます。ムービークリップアクションはクリアされません。サイズやスケールを設定したい場合には、読み込み終了後に行う必要があります。
  • SWFファイルを読み込んだ場合、背景と再生速度は、読み込み先のムービーに合わせたものになります。
  • ターゲットインスタンスをduplicateMovieClip()で複製しても読み込んだ画像は複製されません。
  • SWFファイルの読み込みを行ったターゲットインスタンス内ではライブラリの内容がSWFファイルの持つライブラリになります。

外部ファイル読み込み終了後の処理

loadMovie()メソッドを使って外部ファイルを読み込み後に処理を行う際には、以下のように行います。getBytesLoaded()getBytesTotal()を使って以下のように記述します。

【読み込みを行うムービークリップインスタンスのムービークリップアクション】

onClipEvent(data) { // データ読み込み時に発生するイベントdata
    if (this.getBytesTotal()>4 && this.getBytesLoaded() >=this.getBytesTotal()) { 
        終了後処理
    } else { 
        終了前処理
    }
}

データの読み込みが開始されるとdataイベントが発生します。その際に、読み込んだデータサイズとトータルのデータサイズを比較(>=)して終了しているかどうかを判別します。ただし、開始直後にどちらも0の値をとることがあるので、その場合には、終了前としています。

onData()イベントハンドラメソッドを定義して同様の読み込み待ちの処理が可能なのですが、loadMovie()メソッドを使った場合、定義したメソッドがクリアされてしまうために、onClipEvent(data)を使わないといけません。

例 読み込んだ画像のサイズ調整

一定の大きさ(400×300)に合うように縦横比を保持して拡大縮小する例を考えます。400×300の大きさの四角形をシンボルとして 登録し、そのインスタンスに以下のムービークリックアクションを記述します。

onClipEvent(data) { // データ読み込み時に発生するイベントdata
    if (this.getBytesTotal()>4 && this.getBytesLoaded() >=this.getBytesTotal()) { 
        xscale=400/_width;
        yscale=300/_height;
        if (xscale>=yscale && yscale>=100) || (xscale<yscale
    } else { 
        終了前処理
    }
}

外部からの変数読み込み

loadVariables()メソッドを使って外部に定義した変数を読み込むことができます。書式は以下のとおりです。

ムービークリップインスタンス.loadVariables(URL, メソッド)

URLには、CGIまたは外部のテキストファイルを指定します。メソッドはCGIから読み出す場合にPOSTを指定します。

外部テキストファイルには、

変数1=値1&変数2=値2&…

のように変数の値を定義することができます。

例 外部ファイルからの変数読み込み

メニューを外部ファイルで定義してFlashなしで編集ができるようにしてみます。

  1. menuシンボルを作成します。シンボルの中には、変数botanを表示するダイナミックテキストボックスを作成します。
  2. menuシンボルのインスタンスmenu1, menu2, ・・・を必要な数だけ作成し、ムービークリップアクションにクリックしたら変数urlのアドレスを開くスクリプトを定義します。
    on(release) {
        getURL(url);
    }
    
  3. メインフレームに以下のフレームアクションを記述します。
_root.loadVariables("menu.txt"); // メインタイムラインの変数として読み込み

_root.onData=function () {
    menu1.botan=botan1;
    menu1.url=url1;
    menu2.botan=botan2;
    menu2.url=url2;
    // 必要なだけ同様に入れる
}

loadVariables()メソッドもロードの実行を待たずに次のステートメントの実行をするので、 直後に変数を使ってもまだ値がよみこまれていない場合があります。そのため、onData()イベント ハンドラメソッドでデータの読み込みがあったときに代入を行っています。