なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこで秒間60枚の画像をパラパラアニメする

イメージを60枚作って順番に表示していきます。
これを丁度1秒間でループするように制御します。

1/60秒待つを挟んでループするだけで簡単にできそう?
いや、できないんです。

f:id:tkizzz:20210830213501j:plain
針がぐるぐるする60枚の画像。針が1周するのに1867ミリ秒かかった。

実験

まず針の画像60枚を用意します。
素材[r]イメージして作成 して6度ごとに線を引きます。

//部品
素材とは変数
塗スタイル「透明」
r0から59まで繰り返す
  素材[r]イメージして作成
  素材[r]サイズ「0,0,200,200」
  素材[r]可視オフ
  素材[r]画面クリア
  素材[r]0,0から200,200円
  x=100+COS(ラジアン変換(360/60*r-90))*100
  y=100+SIN(ラジアン変換(360/60*r-90))*100
  素材[r]100,100からx,y

時計の針のような画像が素材[r]に60枚用意できました。
これを「1/60秒待つ」をはさんでループを回してみます。

表イメージとはイメージ
その位置「0,0」
1ループ
 r0から59まで繰り返す
  表イメージ画像素材[r]名前 //動的作成した場合は名前を参照する
  1/60秒待つ //←待つ

結果は……一周1867ミリ秒と、少しゆっくり。
f:id:tkizzz:20210830213501j:plain
これを一周1000ミリ秒にするのが目的です。

まず最速を目指す

「待つ」を短くしたらどうなるでしょうか。
「0秒待つ」としてみましょう。
(単に消すと無限ループになり、0秒待つとちゃんと描画更新されます)

表イメージとはイメージ
その位置「0,0」
1ループ
 r0から59まで繰り返す
  表イメージ画像素材[r]名前
  0秒待つ //←ここ

結果は……一周934ミリ秒といいところ。
でも何の制御にもなってないし、環境で変わりそうなので参考記録とします。

描画処理反映

0秒待つの代わりに「描画処理反映」を挟んでみます

表イメージとはイメージ
その位置「0,0」
1ループ
 r0から59まで繰り返す
  表イメージ画像素材[r]名前
  描画処理反映 //←ここ

結果は……一周37~40ミリ秒と非常に高速。
速すぎて残像が見える速度です。 これに制御を入れていきます。

制御する

システム時間(ミリ秒単位で取得)を使って今表示すべき画像を割り出していきます。
システム時間の下三桁をとってきて0~999ミリ秒を取り出し、60個に分割。
1000ミリ秒で60枚なので、1枚16.67ミリ秒。

0~16ミリ秒なら素材[0]を表示
17~33ミリ秒なら素材[1]を表示
34~50ミリ秒なら素材[2]を表示……となるように素材[r]のrを計算します

表イメージとはイメージ
その位置「0,0」
1ループ
  下三桁=システム時間%1000
  r=INT(下三桁/(1000/60))  //←ここ
  表イメージ画像素材[r]名前
  描画処理反映

結果は……1周1001ミリ秒
システム時間からrを求めている部分では、ループ中に同じ画像が連続で表示されることもあれば一つ飛ばすこともあると思います。

f:id:tkizzz:20210830214331j:plain
画像じゃ伝わらないけど1秒で針が一周する

番外編

GIFアニメは10ミリ秒単位でのみ表示間隔を変えられるそうです。
秒間60枚は無理そう。
なでしこのアニメ部品も同じような感じ。
微妙な間隔は設定できないみたいです。