2015年05月16日

<ウディタ>歩行アニメーションのパターン数を増やしたいA


デフォルトの歩行アニメーションの切替間隔が何フレームあるかを調べました。

<調べ方>
以下のコマンドを常時並列コモンで実行しました。(こんなのに興味のある人はいるかな)
なんとなく誤差がありそうですが、まぁあっても1フレームじゃないでしょうか。

■ウェイト:1 フレーム
■変数操作+: CSelf11[今のP番号] = 主人公 の アニメパターン[0-4]
■条件分岐(変数): 【1】CSelf11[今のP番号] が CSelf12[前のP番号]と同じ 【2】CSelf11[今のP番号] が CSelf12[前のP番号]以外
-◇分岐: 【1】 [ CSelf11[今のP番号] が CSelf12[前のP番号]と同じ ]の場合↓
|■変数操作: CSelf13[今になってからのフレーム数] += 1 + 0
|■
-◇分岐: 【2】 [ CSelf11[今のP番号] が CSelf12[前のP番号]以外 ]の場合↓
|■文字列操作:CSelf5[表示文字列] += "\cself[12]番を表示した時間は\cself[13]フレーム\n"
|■変数操作: CSelf13[今になってからのフレーム数] = 0 + 0
|■
◇分岐終了◇
■ピクチャ表示:15 [左上]文字列[\cself[5]] X:381 Y:0 / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 50% / カラー R[100] G[100] B[100]
■変数操作: CSelf12[前のP番号] = CSelf11[今のP番号] + 0

<結果>
連続移動中の切替は、この調査方法では5フレームと4フレーム交互に行われているように思われました。
具体的には、

3パターンの場合は(上段がパターン番号、下段が上段のパターンを表示し続けたフレーム数)
1012が
4545

5パターンの場合は(同)
34321012が
54545454

・・・となりました。
移動速度を変更しても切替間隔は変化しませんでした。


<考察>
まず疑問に思うのが、なぜ交互に間隔が5と4で変わるのかです。
ぼくの調べ方がまずいのかもしれませんが、それもよくわかりませんでした。
この数字を信じるなら1周期の表示をするのに18フレームかかっていますね。

昨夜調べてわかったのですが、一番遅い移動速度で1マス進むのに、3パターンだと1周期表示が巡るようです。
移動時間(マス/フレーム)なんて基本的なことだからどこかに載ってないかと検索しましたが、ぱっと見では見当たらなかったです。

デジタルの原理は不案内なのですが、18なんて16に比べたら扱いやすいわけではないだろうに、全パターン4フレームにするわけにはいかなかったのでしょうかね。
やはりぼくの計り方がおかしいのでしょうか。
各パターン番号の表示内容と表示時間の関係に意味があるのかとも思いましたが、3パターンと5パターンで一貫性はないですね。
3パターンの場合は右足や左足が出てる時は長く、切替中の過渡期は短いです。
一方で5パターンでは足が出てる時と基本姿勢が短く、切替中の過渡期は長いです。

あ、まさか、全ての表示は4.5フレームで行われてるけどそれを計測したら処理の関係でこのように見えてしまうとか?
ウディタは何をするにもフレーム単位でしか動けないヤツだと思ってましたが、ひょっとして違うという可能性もあるのかな。
うーんよくわからない・・・。

--------------------------------------------------------------------------------
後日追記
この記事を書いてる時点で、アニメ頻度は変更できるということをすっかり忘れていました。
なので、ここで454545とか書いたのも7段階あるうちの一つの間隔に過ぎず、それほど深く考えるべき内容ではなかったと後でわかりました。
またこの記事で使った「フレーム」という言葉は、計測したところ、定義である「一秒に60回」の半数以下という結果になりました。謎です。
このあたりのことは今でも理解できていませんが、ともかくこの記事の内容は鵜呑みにしないでください。
--------------------------------------------------------------------------------



<今後の展望>
これはまずいことになってきましたよ。
歩行アニメーションのパターン数を増やしたいということで始めた今回の試みですが・・・。
各パターンの表示時間を2分割すれば2倍の枚数のグラフィックでなめらかアニメーションができると思ってたのに、まさか複数の表示時間が混在していたとは。
けれどよく考えてみれば、枚数を2倍にしたら偶数になりますね。
偶数ならどこかでカクッとなってしまい、なめらかにアニメーションできない気がします。
「片側にふれて戻って反対にふれてもどって」、この動きは偶数じゃ帳尻が合いませんよね、多分。
表示時間を3分割すればいいんだけど、けれども4も5も、3では割れない・・・。
一体どうしたもんでしょうか。


今日の記事は「調査研究考察」というカテゴリーにしますが、それはここまで。以下は昨夜の続きのいうなれば「雑文」です。
せっかく「現在表示中のパターン番号」を取得できるんだから、それを使って「現在表示すべき画像」を決定したらいいと思ったのですが。
でもデフォルトのアニメーションがどうなっているか大体わかった今、アニメーションのパターン数を増やすためには、原理的にはデフォルトのパターン番号は関係ないですよね。
これを実現するために知りたいことはただ一つ。
現在の瞬間は移動継続中かどうか。それだけです。

そのための方法は3つくらい思いつきます。
一つは、今まで考えた「現在表示中のパターン番号」を使う方法。
この値が停止中の番号じゃなくなったらその瞬間から移動開始と分かります。でも移動終了判定が難しい。
アニメーションの途中でも停止の番号になりますもんね。
これをもとに停止の判定をするなら、その番号が4あるいは5より長いフレームの間続くことを見届けないといけません。
移動が終了しても6フレームくらいの間は画像は前のままです。
特に連続移動はしているけど移動方向を切り替えた場合の表示がおかしくなりそうな気がします。
なめらかさを追究するのに、6フレームの判定遅れはまずいですよね。デフォルトの方がましっていうレベルです。

別の方法は、全て手づくりでコツコツやる方法。
キー入力を参照して、移動先の通行設定も判定して、連続移動を判定します。
マスとマスの間を移動中のタイミングでは方向キー入力は受けつけないので、その瞬間だけ方向キーが押されてなくてもノーカンです。
なんだかできる気がしない・・・。

そして最後の方法は、システム変数の「主人公移動中?(1=Yes)」を使います。
でもこれの困った所は、マスの真上にぴったり重なった瞬間は連続移動中でも0になってしまうことです。
移動中にこの値を常時並列コモンで表示し続けると、0になる時とならない時があります。
(だいぶ前に初めて立ち鏡を作った時「鏡の前を横切っても映る時と映らない時とがあります」と書きましたがそれに通じるものがあるんでしょうね)
けれど今これを試していて不思議なことに気づきました。
最初確かに0になる時とならない時があって、切り替わり続けるのですが、しばらく歩き続けると、ある時を境にして、移動中は1、停止中は0という完璧な判定になります。
判定タイミングの問題なんでしょうけどね。
処理中に1フレームウェイトを入れるといつまでたっても最初と同じまま、切り替わり続けます。
わけがわかりません。

これらの方法はどれも一長一短でなかなかいい方法はないんですけどね。
しかしここであきらめるわけにはいきません。
なので次回の記事では、上に書いた3つ目の方法を使って考えてみます。
「主人公移動中?」が0の状態が2フレーム以上続いた時だけ主人公停止と判断する、「ざっくり言って移動中?」とでも呼ぶべき指標を作ろうかと思っています。
posted by じゃ。 at 23:27| Comment(0) | 調査・研究・考察 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: