アニメ編(その五)

ページ名:tutorial_anime_5
戻る:アニメ編(その四)


移動専用のパラメータ


ここまではアニメーションを表示するために、個々の一時描画に対して座標を与えて表示する方式を取っていました。
もちろんこの方式なら好きな位置に表示させることが出来て、汎用性が高いといえばいえるのですが、座標を都度計算したり確認したりするのはそれなりに面倒くさい作業でもあります。


そこで今回はそれに変わる方法、移動に特化した専用のパラメータをふたつ紹介します。


相対座標で移動を指定する animemove


animemoveパラメータは前回の一時描画を表示した位置からの相対座標を指定して一時描画します。


パラメータ名機能設定値
animemove一時描画の移動を相対座標で指定水平・垂直方向への移動距離をコンマで連結して指定

たとえば、前回の一時描画が (250,100) の位置だったとして、animemove=-35,50 と指定すると次は (215,150) の位置に表示されるわけです。
この animemove パラメータを使って前回までの親父横移動アニメを書き換えると、このようになります。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=250
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animemove=150,0
 16: wait=250
 17: 
 18: [Master_02]
 19: loadcache=1
 20: visible=0
 21: animation=3
 22: animemove=150,0
 23: wait=250
 24: 
 25: [Master_03]
 26: loadcache=1
 27: visible=0
 28: animation=3
 29: animemove=150,0
 30: wait=250
 31: 
 32: [Master_04]
 33: loadcache=1
 34: visible=0
 35: animation=3
 36: animemove=150,0
 37: wait=250

この場合、[Master_01] は [Master_00] を元に座標を決定し、[Master_02] は [Master_01] を元に座標を決定し・・・という具合ですね。それほど難しくはないと思います。
では、実行して確認しましょう。



animemove の特徴


ヘルプファイルには書かれていませんが*1animemove パラメータには以下のような特徴があります。


  • 同一セクション内で animeposition と animemove が同時に指定された場合、animemove が優先されます。
  • animemove を指定されたセクションと、前回の一時描画セクションが同じ画像を表示するかどうかは問題にされません。表示する画像がたとえ別であってもお構いなく、前回座標を元に座標を算出して一時描画を行います。
  • 前回の一時描画が存在しない場合(つまり最初の一時描画の場合)、前回の座標が (0,0)であったと見なします。
  • ひとつの背景変更コンテクストに二つ以上の JPY ファイルがあっても、ファイルをまたがって前回の一時描画を参照することはありません。適用範囲は JPY ファイルの内部のみです。

animemove パラメータは表示する画像と関係ない、ということを確認するために、次のような JPY ファイルを作ってみます。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=250
 10: 
 11: [Daughter_00]
 12: fileName=宿の娘.bmp
 13: savecache=2
 14: visible=0
 15: animation=3
 16: animemove=150,0
 17: wait=250
 18: 
 19: [Master_01]
 20: loadcache=1
 21: visible=0
 22: animation=3
 23: animemove=150,0
 24: wait=250
 25: 
 26: [Daughter_01]
 27: loadcache=2
 28: visible=0
 29: animation=3
 30: animemove=150,0
 31: wait=250
 32: 
 33: [Master_02]
 34: loadcache=1
 35: visible=0
 36: animation=3
 37: animemove=150,0
 38: wait=250

今度は娘さんにも参加してもらいますが [Master_00] 以外は animemove による相対座標指定のままです(設定値も変わっていません)。順番的には親父・娘・親父・娘・親父となりますが、その表示位置はどうなるか、よく見ておいてください。



表示される画像は変わりましたが、表示位置や順番、そしてタイミングは今までと変わりませんでしたね。
つまり、娘さんの位置はその直前の親父の位置を基準に算出され、親父の位置もまた同様にその直前の娘さんの位置から算出される、ということです。
fileName パラメータで毎回ファイルを指定しようが、キャッシュを使おうが、この点は特に変わりません。


移動先の座標と速度で指定する animespeed


animespeed は名前のセンスこそイマイチですが、優れた機能を持つ使いやすいパラメータです。これは animeposition と組み合わせて移動の始点と終点、そして一回の移動距離を指定することで、連続的な移動を指定することが出来ます。


パラメータ名機能設定値
animespeed一時描画の連続移動を指定一回分の移動距離(単位:ピクセル)

animespeed は単独で用いられるのではなく、他のセクションや幾つかのパラメータの組み合わせで効果を発揮します。それを模式的に表すと以下のようになります。


[始点]
animation=N(1 ~ 3 のいずれか)
animeposition=始点の座標

[終点]
animation=N(1 ~ 3 のいずれか)
animeposition=終点の座標
animespeed=移動一回辺りの移動距離
wait=一時描画の更新間隔

このように animespeed を含めたセクションが指定されると、画像は始点から終点に向かって連続的に、animespeed で指定した距離の分ずつ移動した場所に表示され続けます。


これを用いると、今までの親父横移動アニメは以下のように記述することが出来ます。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=250
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animeposition=600,0
 16: wait=250
 17: animespeed=150

だいぶ短くなってスッキリしましたね。この JPY ファイルを使って動作を確認してみます。



これまでのものと変わりなく表示されており、何の問題もありません。


animespeed の利点


animespeed では直線移動しか出来ないにせよ、編集が楽なので一時描画の表示タイミングを調整しやすいという非常に大きなメリットがあります。


例えば。
今までの親父横移動アニメでは一回の移動距離を 150 ピクセル、ウェイトを 250 ミリ秒としていました。しかし動作させて表示を確認したところ不満があり、これをもっと滑らかに移動させたいと思ったとしましょう。
たとえば一回の移動距離を 30 ピクセル、ウェイトを 50 ミリ秒とすると。つまり今までの五倍に描画を増やすわけですが、そうなると当然セクション数は五倍になるわけです。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=50
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animeposition=30,0
 16: wait=50
 17: 
 18: [Master_02]
 19: loadcache=1
 20: visible=0
 21: animation=3
 22: animeposition=60,0
 23: wait=50
 24: 
 25: [Master_03]
 26: loadcache=1
 27: visible=0
 28: animation=3
 29: animeposition=90,0
 30: wait=50
 31: 
 32: [Master_04]
 33: loadcache=1
 34: visible=0
 35: animation=3
 36: animeposition=120,0
 37: wait=50
 38: 
 39: [Master_05]
 40: loadcache=1
 41: visible=0
 42: animation=3
 43: animeposition=150,0
 44: wait=50
 45: 
 46: [Master_06]
 47: loadcache=1
 48: visible=0
 49: animation=3
 50: animeposition=180,0
 51: wait=50
 52: 
 53: [Master_07]
 54: loadcache=1
 55: visible=0
 56: animation=3
 57: animeposition=210,0
 58: wait=50
 59: 
 60: [Master_08]
 61: loadcache=1
 62: visible=0
 63: animation=3
 64: animeposition=240,0
 65: wait=50
 66: 
 67: [Master_09]
 68: loadcache=1
 69: visible=0
 70: animation=3
 71: animeposition=270,0
 72: wait=50
 73: 
 74: [Master_10]
 75: loadcache=1
 76: visible=0
 77: animation=3
 78: animeposition=300,0
 79: wait=50
 80: 
 81: [Master_11]
 82: loadcache=1
 83: visible=0
 84: animation=3
 85: animeposition=330,0
 86: wait=50
 87: 
 88: [Master_12]
 89: loadcache=1
 90: visible=0
 91: animation=3
 92: animeposition=360,0
 93: wait=50
 94: 
 95: [Master_13]
 96: loadcache=1
 97: visible=0
 98: animation=3
 99: animeposition=390,0
100: wait=50
101: 
102: [Master_14]
103: loadcache=1
104: visible=0
105: animation=3
106: animeposition=420,0
107: wait=50
108: 
109: [Master_15]
110: loadcache=1
111: visible=0
112: animation=3
113: animeposition=450,0
114: wait=50
115: 
116: [Master_16]
117: loadcache=1
118: visible=0
119: animation=3
120: animeposition=480,0
121: wait=50
122: 
123: [Master_17]
124: loadcache=1
125: visible=0
126: animation=3
127: animeposition=510,0
128: wait=50
129: 
130: [Master_18]
131: loadcache=1
132: visible=0
133: animation=3
134: animeposition=540,0
135: wait=50
136: 
137: [Master_19]
138: loadcache=1
139: visible=0
140: animation=3
141: animeposition=570,0
142: wait=50
143: 
144: [Master_20]
145: loadcache=1
146: visible=0
147: animation=3
148: animeposition=600,0
149: wait=50

こうなると、ずいぶん手を入れる箇所が増えますよね。セクションをいっぱいコピペし、間違えずにセクション名や座標を指定してやらなければなりません。


ま、手間ひまかけて修正が終わったとしましょう。その上で動作確認をします。



これであなた自身が納得がいけばいいですが、そうでなければまた修正が必要です。
それは「もっとゆっくり」なのか「もっと素早く」なのか、「もっとなめらかに」なのか「もっとダイナミックに」なのか、感じ方は人それぞれでしょうけれども、その都度セクションを増やしたり減らしたり、セクション名も重複しないように修正し、表示位置も計算し直して修正し・・・では、あっという間に時間が過ぎてしまいます。
たまの休日を利用して趣味に興ずる社会人には、時間のムダとしかいいようがありません(もちろん学生さんにとってもです)。


その点、animespeed を用いれば修正は非常に簡単です。二箇所変えるだけでいいんですから。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=0,0
  9: wait=250
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animeposition=600,0
 16: wait=50
 17: animespeed=30

修正箇所は 16 ~ 17 行目、それぞれのパラメータの設定値を直すだけで、先ほどの 149 行の JPY ファイルと同じことが実現できるんです。どう考えてもこちらの方が作業効率がいいですよね。
修正箇所が減るということは、バグが入りにくいということでもあります。変更の都度あちこち修正しなきゃいけないような作りだと、大抵どこかで直し忘れたり、間違えたりするものですからね。その点、修正箇所が少なければそれだけ直し忘れも間違いも少ないということです。


単純な等速直線運動しか表現できないという問題はありますが、目的を達成できるのであれば animespeed は非常に使い勝手のいいパラメータです。積極的に使って損はありません。


animespeed の特徴


animespeed パラメータには以下の特徴があります。


  • animespeed パラメータに 0(デフォルト値)を指定すると animeposition で指定した終点に一時描画するだけです(事実上 animespeed の意味が失われますが、これはデフォルト値の動作として良識的であり妥当です)。
  • animespeed パラメータにマイナスの値を指定するのは危険です。終点と逆方向に向かって移動をはじめ、画面からはみ出してもなお描画を続けようとするため必ず無限ループに陥ります。それを防ぐ安全機構を CardWirth は持っておらず、F9 を押して動作を中断するほかありません。
  • animespeed パラメータを指定したセクションに animemove パラメータを指定すると、両者を折衷したような動作になります(ヘルプに記載のない動作)。
    • 前回の一時描画を行った位置から animemove の分だけ相対的にズレた位置を終点として一時描画します。
    • animeposition は、値が設定されていても無視されます。
  • animespeed を指定されたセクションと、前回の一時描画セクションが同じ画像を表示するかどうかは問題にされません(animemove と同様)。
  • 前回の一時描画が存在しない場合(つまり最初の一時描画の場合)、前回の座標が (0,0)であったと見なします(animemove と同様)。

animespeed と animemove を併用した場合は「あるポイントから特定の方向へ向かって移動」という感じの一時描画指定となります。分かりにくいかもしれませんので、例を示しましょう。


  1: [init]
  2: 
  3: [Master_00]
  4: fileName=宿の亭主.bmp
  5: savecache=1
  6: visible=0
  7: animation=3
  8: animeposition=300,150
  9: wait=250
 10: 
 11: [Master_01]
 12: loadcache=1
 13: visible=0
 14: animation=3
 15: animeposition=600,0
 16: animemove=-150,-250
 17: wait=250
 18: animespeed=30

まず [Master_00] セクションでは animeposition の指定を変更し、(300,150) と画面の中央辺りを指定しています(8 行目)。ここが一時描画の始点です。


次に [Master_01] セクションでは以下の三行に着目して下さい。


  • 18 行目には animespeed パラメータが指定されています。
  • 16 行目には animemove パラメータが指定されています。これは移動の終点を相対的に指定しており、前回一時描画位置の (300,150) から相対的に (-150,-250) ズレた位置を終点として指定しています(つまりは (150,-100) ということです)
  • 15 行目には animeposition パラメータが指定されています。普通であればこの行が移動の終点を意味するのですが、このケースでは無視されます(16 行目に animemove があるからです)。

では、実際に動作を確認してみましょう。
説明どおり animemove による相対指定が有効なら一時描画は左上に、そうではなくて animeposition が有効なら一時描画は右上のに向かって移動するはずですが・・・



左上に移動しましたね。animeposition の指定は無視され、animemove による指定が優先されたというわけです。


animeposition によって終点の絶対座標を指定する方法も、animemove によって相対座標で指定する方法も、それなりに使い道がありそうです。
好みに合わせて、あるいは演出の内容や状況によって使い分けるとよいでしょう。


まとめとおさらい


今回は一時描画の移動について、新しい方法を説明しました。
ポイントは以下の通りです。


  • animemove パラメータを用いると相対的に座標を指定できる
  • animespeed パラメータを用いると始点・終点を指定し、自動的に中間の描画を補完させることができる
    • animespeed の終点も、animeposition による絶対指定と animemove による相対指定の両方が使える

今回登場したパラメータは以下の二つです。


パラメータ名機能
animemove一時描画の移動を相対座標で指定
animespeed一時描画の連続移動を指定

次回は画像の拡大と縮小について説明します。
エフェクトブースターの純然たる技術的な話だけではなく、映像における演出論も少し取り上げる予定です。


戻る:アニメ編(その四)

*1 読むに耐えないので引用しませんが animemove についてのヘルプの記述は特にひどいもので、この項ひとつをとっても関係者は批難されてしかるべきです。誰ひとりとして真剣に文章のチェックをしたとは思えず、こうしたいい加減さがエフェクトブースター利用の妨げになっていたことは否めません

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧