アニメーションの基本的な定義は、イメージを徐々に変化させることによって、動いている、または変化しているように見せることです。 このサンプルでは、球体の月がその垂直軸を中心に回転しているように見せることが目標です。 ただし、このアニメーションでは、サンプルの球体の歪みは無視できます。 月のイメージデータのソースとして実際に読み込んで使用するイメージを次に示します。
ここからわかるように、イメージは 1 つまたは複数の球体ではなく、月面の長方形の写真です。この写真は月の赤道で撮影されたものなので、イメージの上下に近い部分は引き伸ばされ、歪んでいます。イメージから歪みを削除し、球体に見えるようにするには、後で説明するように置き換えマップフィルターを使用します。 ただし、このソースイメージは長方形なので、球体が回転しているように見せるには、コードで月面写真を水平方向に移動する必要があります。
このイメージには、実際には月面写真のコピーが 2 つ並んで含まれています。 このイメージはソースイメージであり、ここからイメージデータを繰り返しコピーして、動いている様子を作成します。 イメージの 2 つのコピーを並べることにより、連続した、中断されないスクロール効果をより簡単に作成できます。 アニメーションのプロセスを順を追って説明し、その動作を確認していきます。
このプロセスには、実際には 2 つの個別の ActionScript オブジェクトが関連しています。 まず読み込まれたソースイメージがあり、このコードでは、
textureMap
という名前の BitmapData インスタンスによって表されます。前述のように、外部イメージが読み込まれると、直ちにイメージデータが
textureMap
に入力されます。
textureMap = event.target.content.bitmapData;
textureMap
のコンテンツは、長方形の月のイメージです。さらに、回転のアニメーションを作成するために、月のイメージを画面上に表示する実際の表示オブジェクトである、
sphere
という名前の Bitmap インスタンスをコードで使用します。
textureMap
と同様に
sphere
オブジェクトが作成され、次のコードを使用して、
imageLoadComplete()
メソッドの初期イメージデータが入力されます。
sphere = new Bitmap();
sphere.bitmapData = new BitmapData(textureMap.width / 2, textureMap.height);
sphere.bitmapData.copyPixels(textureMap,
new Rectangle(0, 0, sphere.width, sphere.height),
new Point(0, 0));
コードに示されているように、
sphere
はインスタンス化されます。その
bitmapData
プロパティ(
sphere
によって表示される未処理のイメージデータ)が、
textureMap
と同じ高さと半分の幅で作成されます。つまり、
textureMap
イメージには並べられた 2 枚の月面写真が含まれているので、
sphere
のコンテンツは 1 枚の写真のサイズになります。次に、
bitmapData
プロパティに、その
copyPixels()
メソッドを使用してイメージデータが入力されます。
copyPixels()
メソッド呼び出しのパラメーターは次のことを示します。
-
最初のパラメーターは、イメージデータが
textureMap
からコピーされたことを示します。
-
2 番目のパラメーター(新規の Rectangle インスタンス)は、
textureMap
のどの部分からイメージスナップショットを取得するかを指定します。この場合は、スナップショットは、
textureMap
の左上隅(最初の 2 つの
Rectangle()
パラメーター
0, 0
で示される)から始まる長方形で、その長方形スナップショットの幅と高さは、
sphere
の
width
および
height
プロパティに一致します。
-
3 番目のパラメーター(x および y 値が
0
の新規の Point インスタンス)は、ピクセルデータのターゲットを定義します。この場合は、
sphere.bitmapData
の左上隅(0, 0)です。
視覚的に表現すると、このコードは、次のイメージに示す
textureMap
からピクセルをコピーし、
sphere
に貼り付けます。つまり、
sphere
の BitmapData コンテンツは、ここで強調表示した
textureMap
の一部です。
ただし、これは
sphere
の初期状態にすぎません。つまり、
sphere
にコピーされる最初のイメージコンテンツです。
ソースイメージを読み込んで
sphere
を作成すると、
imageLoadComplete()
メソッドによって実行される最後のタスクは、アニメーションの設定になります。アニメーションは、次のコードによって作成および開始される、
rotationTimer
という名前の Timer インスタンスによって制御されます。
var rotationTimer:Timer = new Timer(15);
rotationTimer.addEventListener(TimerEvent.TIMER, rotateMoon);
rotationTimer.start();
このコードは、最初に
rotationTimer
という名前の Timer インスタンスを作成します。
Timer()
コンストラクターに渡されたパラメーターは、
rotationTimer
がその
timer
を 15 ミリ秒ごとにトリガーすることを示します。次に
addEventListener()
メソッドが呼び出され、
timer
イベント(
TimerEvent.TIMER
)が発生したときにメソッド
rotateMoon()
を呼び出すことを指定します。最後に、
start()
メソッドを呼び出すことにより、タイマーを実際に起動します。
rotationTimer
の定義に従って、月のアニメーションが実行される MoonSphere クラスの
rotateMoon()
メソッドを Flash Player が約 15 ミリ秒ごとに呼び出します。
rotateMoon()
メソッドのソースコードは次のとおりです。
private function rotateMoon(event:TimerEvent):void
{
sourceX += 1;
if (sourceX > textureMap.width / 2)
{
sourceX = 0;
}
sphere.Data.copyPixels(textureMap,
new Rectangle(sourceX, 0, sphere.width, sphere.height),
new Point(0, 0));
event.updateAfterEvent();
}
このコードによって次の 3 つの操作が行われます。
-
変数
sourceX
の値(初期値は 0 に設定)が 1 ずつ大きくなります。
sourceX += 1;
後で説明するように、
sourceX
は、
sphere
にピクセルをコピーする
textureMap
での元の位置を指定するので、このコードによって、
textureMap
で長方形が 1 ピクセル右に移動します。視覚的な表現で説明すると、数サイクルのアニメーションの後、ソース長方形は次のように数ピクセル右に移動します。
その数サイクル後には、長方形はさらに遠くに移動します。
このようにピクセルのコピー元を徐々に絶えず移動することが、アニメーションでは非常に重要です。 ソースの位置をゆっくりと継続して右方向に移動することにより、
sphere
の画面に表示されるイメージは、左方向に絶え間なく移動しているように見えます。月面写真の 2 つのコピーがソースイメージ(
textureMap
)に必要なのはこのためです。長方形が絶え間なく右方向に移動しているので、ほとんどの時間は、長方形は 1 つの月面写真ではなく、2 つの月面写真に重なっています。
-
ソース長方形が右方向にゆっくりと移動すると、1 つの問題が発生します。 最終的に長方形が
textureMap
の右端に達し、
sphere
にコピーする月面写真のピクセルがなくなります。
次のコード行でこの問題を解決します。
if (sourceX >= textureMap.width / 2)
{
sourceX = 0;
}
このコードは、
sourceX
(長方形の左端)が
textureMap
の中央に達したかどうかをチェックします。達した場合は、
sourceX
を 0 にリセットし、
textureMap
の左端に戻して、サイクルを再開します。
-
適切な
sourceX
値を計算したら、アニメーション作成の最後の手順は、新しいソース長方形のピクセルを
sphere
に実際にコピーすることです。この操作を実行するコードは、最初に
sphere
にデータを入力したコードとよく似ています(前述)。唯一異なる点は、
new Rectangle()
コンストラクター呼び出しで長方形の左端が
sourceX
に置かれることです。
sphere.bitmapData.copyPixels(textureMap,
new Rectangle(sourceX, 0, sphere.width, sphere.height),
new Point(0, 0));
このコードは 15 ミリ秒ごとに繰り返し呼び出されます。 ソース長方形の位置が絶え間なく移動し、ピクセルが
sphere
にコピーされると、画面上では
sphere
が表す月面写真イメージが絶え間なく流れ続けます。つまり、月が回転し続けているように見えます。