2010-11-26 15 views
8

私はページ上にアニメーションキャラクターを持ち、異なる動作のために異なるアニメーションが必要です。私は現在、どのように動作するかについて2つのアイデアを持っています:イメージアニメーションを制御するJavaScript?

IDEA 1:それぞれの動作をアニメーションGIFとして、JavaScriptを使用して動作を切り替えるときにGIFファイルを切り替えます。上向き:アニメーションはイメージそのものにあり、JSの仕事は少なくなります。欠点:GIFがどのフレームにあるか、アニメーションが終了する/ループするかなどをJavaScriptが知らせる(私が知っている)方法はありません。

IDEA 2:各アニメーションの各フレームをPNGイメージとして、JSアニメーションの開始前にすべての画像が準備されていることを確認するために、いくつかのプリローダーを使ってフレーム間を切り替えることができます。上向き:アニメーションシーケンスをもっと制御します。欠点:たくさんのフレーム...

これらの2つのアイデアのどちらが良いでしょうか? (私はこのためにフラッシュを使用しないでください、btw)
私は自分自身に、より良いコントロールを提供するために自分自身に傾いています。サイトには既に50msごとにタイマーが設定されているため、このアニメーションをそのタイマーシステムに追加することはあまりありません。

+2

あなたはちょうどあなた自身の質問に答えました。 – galambalazs

+1

私はどちらが本当に良いのかを尋ねていますが、私の意見が正しいかどうか、どんな理由があるのか​​を尋ねています。 –

+0

も参照してください[GIFアニメーションをJavascriptで制御できますか?](https://stackoverflow.com/questions/2385203/can-you-control-gif-animation-with-javascript) – user

答えて

13

私はこれが古かったと知っていますが、オプション2に似ているものの、オプション3を与えています。

フレームを読み込む代わりに、大きなスプライトマップにすべてのフレームと、すべてのアニメーション+座標のマップをロードする必要があります。あなたは正しいディメンションを使ってdivの背景としてスプライトを持っています。あなたはちょうど右のフレームに背景画像を移動する必要があります。

異なる行にすべてのイベントを設定し、それぞれのアニメーションを異なる列にフレームすることができます。これにより、簡単に制御できるグリッドが作成されます。あなたはすべてのアニメーションをロードするために、サーバへの複数の接続を作成する必要はありません

プラス

  • おそらく速くロードよりもアニメーションやフレーム
  • 以上の良好な制御や画像
  • を切り替える
  • PNGはgifよりも優れたアルファ結果を表示します

マイナス

  • あなたはfreezeframe.jsを見てみることをお勧めします自分で
+0

インスタント勝ちです。私は疑問の時にスプライトシートについて知らなかったし、別の「プラス」は、アニメーションを開始する前にただ一つの 'onload'イベントだけを起動する必要があるということです! –

+0

すばらしいアイデア。 @Kolinkはそれがどのように働くかを教えてください –

+1

私は最近、似たようなことをしなければなりませんでした(3d回転する家)。私は個々の画像を選択しました。なぜなら、600x400の100画像のスプライトが非常に大きいかもしれないからです。すべての画像を「新しい画像()」で読み込み、配列リストに追加しました。次に、インデックスを使用して1つのイメージから別のイメージに移動し、のsrcを変更するだけです –

2

JavaScriptはAnimated GIFの現在のフレームを制御する方法がありません。ブラウザ間でも、私が知っている特定の(ActiveX/Mozillaに固有の)拡張機能を使用することもできません。

あなたはアイデア2が残っていると思います。この方法で達成できる結果がどれほど滑らかであるかはわかりませんが、テストする必要があります。

+0

GIFを制御する方法はありません。ありがとう:) –

+0

最良の可能な間隔10-20ms - > 50 fpsは悪いIMHOではありません。 – galambalazs

+0

@galambalazsいいえ、それはそれがブラウザ間で安定して実行することが可能な場合はかなりまともな音です。 –

2

アイデア1では、GIFがループする時間の後にイベントをトリガーするために、setTimeOut()メソッドを使用できます。しかし、この問題は、GIFがJavaScriptとは別の時間に開始することがあるということです。

個人的には、私はアイデア2に行きます。フレームが比較的小さい限り、クライアントはすべてのイメージをかなり素早くダウンロードします(16x16px PNGは〜500バイトです)。クライアントコンピュータはフレームの移動に問題はありません。

もう1つの考え方は、1つの長いイメージ内にすべてのフレームを下に置き、CSSとjQuery(またはバニラのJavaScript)を使用してCSS background-positionプロパティを50msごとに変更することです。これは画像が小さく、コーディングが少し少なくなることを意味します。

+0

はい、すべてのフレームが異なる単一の画像が最適です。それはスプライトと呼ばれ、よく知られているテクニックです。 – Zecc

+0

例のおかげで: – Bojangles

+0

リンクを削除するために私のコメントを編集しました。なぜなら、彼らが最良のアプローチを使用していたかどうかは本当にわかりませんでした。しかし、それはもう一度OKです。h​​ttp://otanistudio.com/swt/sprite_explosions/ – Zecc

0

をすべてのアニメーションを処理する必要があります。 canvas要素を使用して、GIFから最初のフレームを抽出し、一時停止します。

関連する問題