ムービークリップの再生の制御

Flash Player 9 以降、Adobe AIR 1.0 以降

Flash では、タイムラインのメタファーを使用して、アニメーションまたは状態の変化を伝達します。 タイムラインを使用するビジュアルエレメントは、MovieClip オブジェクトか、または MovieClip クラスの拡張である必要があります。 ActionScript ではムービークリップの停止、再生、またはタイムラインの別のポイントへの移動を指示できますが、ActionScript を使用してタイムラインを動的に作成したり、特定のフレームにコンテンツを追加したりすることはできません。これには、Flash オーサリングツールを使用する必要があります。

MovieClip の再生は、SWF のフレームレートで指定された速度でタイムラインに沿って行われます。 また、ActionScript で Stage.frameRate プロパティを設定すると、この設定をオーバーライドできます。

ムービークリップの再生と再生の停止

play() メソッドおよび stop() メソッドを使用すると、タイムライン内でムービークリップの基本的な制御を行うことができます。例えば、画面上を走る自転車のアニメーションが組み込まれたステージ上にムービークリップシンボルがあり、そのインスタンス名が bicycle に設定されているとします。メインタイムラインのキーフレームに次のコードが関連付けられている場合、

bicycle.stop();

自転車は動きません。つまり、アニメーションは再生されません。 自転車の動きは、他のユーザー操作によって開始できます。例えば、startButton という名前のボタンがある場合、ボタンをクリックするとアニメーションが再生されるように、次のようなメインタイムライン上のキーフレームのコードが実行されます。

// This function will be called when the button is clicked. It causes the  
// bicycle animation to play. 
function playAnimation(event:MouseEvent):void 
{ 
    bicycle.play(); 
} 
// Register the function as a listener with the button. 
startButton.addEventListener(MouseEvent.CLICK, playAnimation);

早送りと巻き戻し

ムービークリップで再生を制御する方法は、play() メソッドと stop() メソッドだけではありません。nextFrame() メソッドおよび prevFrame() メソッドを使用して、再生ヘッドをタイムラインに沿って手動で前後に動かすこともできます。これらのメソッドのいずれかを呼び出すと、再生が停止して、再生ヘッドが前方または後方に 1 フレームずつ動きます。

play() メソッドを使用することは、ムービークリップオブジェクトの enterFrame イベントがトリガーされるたびに nextFrame() を呼び出すのに似ています。次の例では、enterFrame イベントにイベントリスナーを作成して bicycle をリスナー関数の前のフレームに戻すことによって、bicycle のムービークリップを逆方向に動かすことができます。

// This function is called when the enterFrame event is triggered, meaning  
// it's called once per frame. 
function everyFrame(event:Event):void 
{ 
    if (bicycle.currentFrame == 1) 
    { 
        bicycle.gotoAndStop(bicycle.totalFrames); 
    } 
    else 
    { 
        bicycle.prevFrame(); 
    } 
} 
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);

ムービークリップに複数のフレームが含まれている場合、ムービークリップの再生は無限に繰り返されます。つまり、最後のフレームの再生が終わると最初のフレームに戻ります。 prevFrame() または nextFrame() を使用する場合、この動作は自動的には行われません。つまり、再生ヘッドが最初のフレーム上にあるときに prevFrame() を呼び出しても、再生ヘッドは最後のフレームに移動しません。上記の例の if 条件では、逆方向の再生ヘッドが最初のフレームまで到達したかどうかを確認し、最初のフレームに到達した場合に再生ヘッドを最終フレームに設定することによって、ムービークリップの逆方向連続再生を実現しています。

異なるフレームへのジャンプとフレームラベルの使用

ムービークリップを新しいフレームに進めるのは簡単です。 gotoAndPlay() または gotoAndStop() を呼び出すと、ムービークリップはパラメーターで指定されたフレーム番号までジャンプします。あるいは、フレームラベルの名前と同じ文字列を渡すこともできます。 タイムライン上の任意のフレームに、ラベルを割り当てることができます。 ラベルを設定するには、タイムライン上のフレームを選択して、プロパティインスペクターの フレーム「ラベル」フィールドに名前を入力します。

複雑なムービークリップを作成する場合を考えると、番号の代わりにフレームラベルを使用する利点は明らかです。 アニメーションのフレーム、レイヤー、およびトゥイーンの数が大きくなる場合は、重要なフレームにムービークリップの動作を表す説明として「オフ」、「ウォーキング」、または「ランニング」などのラベルを付けるようにしてください。ラベル付きフレームに移動する ActionScript 呼び出しは、指定のフレーム番号ではなく単一の参照、つまりラベルに対するポインターであるため、読みやすさと柔軟性が向上します。アニメーションの特定のセグメントを、後から別のフレームに移動する場合でも、移動先のフレームに対して同じラベルを使用する限りは、ActionScript コードを変更する必要はありません。

コードのフレームラベルを表示するため、ActionScript 3.0 には FrameLabel クラスがあります。 このクラスの各インスタンスは単一のフレームラベルを表し、プロパティインスペクターで示されるフレームラベル名を表す name プロパティと、タイムライン上でラベルが配置されているフレームの番号を表す frame プロパティがあります。

ムービークリップインスタンスに関連付けられている FrameLabel インスタンスへのアクセスを可能にするため、MovieClip クラスには FrameLabel オブジェクトを直接返すプロパティが 2 つあります。 currentLabels プロパティは、ムービークリップのタイムライン全体のすべての FrameLabel オブジェクトで構成される配列を返します。currentLabel プロパティは、タイムラインで最後に到達したフレームラベルの名前を文字列で返します。

ロボット(robot)という名前のムービークリップを作成し、そのアニメーションの様々な状態にラベルを付ける場合を考えます。次のコードでは、currentLabel プロパティをチェックする条件を設定して、ロボットの現在の状態を確認しています。

if (robot.currentLabel == "walking") 
{ 
    // do something  
}

Flash Player 11.3 および AIR 3.3 では、FrameLabel クラスに frameLabel イベントが追加されています。フレームラベルを表す FrameLabel インスタンスにイベントハンドラーを割り当てることができます。このイベントは、再生ヘッドがフレームに入ると送出されます。

次の例では、MovieClip のフレームラベルの Array に、2 番目のフレームラベルの FrameLabel インスタンスを作成します。次に、frameLabel イベントのイベントハンドラーを登録します。

var myFrameLabel:FrameLabel = robot.currentLabels[1]; 
myFrameLabel.addEventListener(Event.FRAME_LABEL, onFrameLabel); 
 
function onFrameLabel(e:Event):void { 
    //do something 
}

シーンの操作

Flash のオーサリング環境では、シーンを使用して SWF ファイルで再生される一連のタイムラインを区切ることができます。 gotoAndPlay() メソッドまたは gotoAndStop() メソッドの 2 番目のパラメーターを使用して、再生ヘッドを送るシーンを指定できます。FLA ファイルはすべて最初のシーンから開始されますが、新しいシーンを作成することもできます。

シーンにはいくつかの短所があるため、シーンの使用が必ずしも最適であるとは限りません。 複数のシーンを含む Flash ドキュメントで、特に作成者が複数存在する場合には、管理が困難になる可能性があります。 パブリッシュする際には 1 つのタイムラインにすべてのシーンがマージされるため、複数のシーンを使用すると、帯域幅の利用効率が悪くなる可能性もあります。 再生されないシーンがある場合でも、すべてのシーンのプログレッシブダウンロードが行われます。 このような理由から、複数の長いタイムラインベースアニメーションを整理するのに必要な場合を除いて、複数のシーンを使用することは推奨されません。

MovieClip クラスの scenes プロパティは、SWF ファイルのすべてのシーンを示す Scene オブジェクトの配列を返します。currentScene プロパティは Scene オブジェクトを返します。このオブジェクトは、再生中のシーンを示します。

Scene クラスには、シーンに関する情報を示すプロパティがいくつかあります。 labels プロパティは、シーン内のフレームラベルを示す FrameLabel オブジェクトの配列を返します。name プロパティは、シーンの名前を文字列で返します。numFrames プロパティは、シーンのフレーム総数を示す整数を返します。