rust nannou Loopを制御する。10フレームだけで止めたい!

nannou

rust nannouでは、標準だと60フレーム前後で描画するようになってます。
実行してから、終了するまでずーっと描画し続けるのがディフォルトの設定です。

けど、「ここで止めたい!」っていうものもありますよね?

円は100個書いたらおしまいにしたい、それ以降は描画してほしくない!
そんな時にどうするか?

今回は10フレームだけ円(円を10個だけ)を描画するを例にして説明していきます。

10フレームだけで止めたい!(円を10個だけ)

10フレームだけ描く方法は、いくつかあります。今回は力業入れて3つ解説していきます。

結論から言うと、一番シンプルなのは、3番目の

loop_ntimes()

を使うことです。

これを含めて、例をあげます。

  1. forを使って10回データ作って、それを描き続ける(フレームは動き続ける)
  2. ifを使って、10フレーム以降描かない(フレームは動き続ける)
  3. LoopModeのloop_ntimes()を使う(フレームは10フレームで止まる)

1.forを使って10回データ作って、それを描き続ける

まずは、forをつかう方法です。

for i in 1..10{
  draw.ellipse();
}
  

シンプル。
まさに10回描画。

この方法を使うと、確かに10回描画できます。10個円を描いて、ひたすら同じところに同じ条件で描き続ければ、見た目は、10個だの円が描かれているように見えます。

ただ、これには問題があります。

「同じ場所に同じ条件で描き続けないといけない」

たとえば、ランダムで座標や色を変えるようなものには不向きです。

2.whileを使って、10フレーム以降描かない(フレームは動き続ける)

次に、whileを使った方法はどうでしょう?

let f = frame.nth();
if f < 10{
  draw.ellipse();
}

これもなかなかシンプル

frame.nth()は、何フレーム目かを取得する関数。(frameはゼロからスタート)

「10フレームより小さい間、ellipseをしてね。」ということ。

たとえば、円だけ10個、それ以外は、描き続けてほしい。なんていうときにはいい使い方かもしれません。

forの時に問題になっていた、同じ条件じゃないとダメっていうのも一応クリアーしています。

3.LoopModeのloop_ntimes()を使う(フレームは10フレームで止まる)

最後にLoopModeを追加って指定回数だけフレームを描く方法。

app.set_loop_mode(LoopMode::loop_ntimes(10));
draw.ellipse();

こうなります。

loop_times(number_of_updates: usize)は、その名の通り、アップデートの回数(フレームを更新する回数)を指定する関数です。

これを使うと10回しか、フレームをアップデートしません。そこで停止します。

上の2つの場合、フレーム更新が停止するわけではないので、ずっとコンピュータは処理を続けます。たとえば、見た目に変化が無くてもたえず処理を続けます。

このloop_timesを使うとフレーム更新が停止するので、その後、アップデート処理は行われません。

たとえば、複雑な描画を1回で、描画しきってしまうような場合、アップデートを続ければ常に処理のリソースを持っていかれすが、これは、停止するので、そこでリソースを浪費しなくなります。

まとめ

こんな感じで3つの方法ご紹介してきました。

どれも一長一短があります。たとえば、一発で色んな処理を施して100個の円を描く、そこで終了!としたいなら、forで100個円を描いて、loop_times(1)*で処理を停止。そこで作品完成という方法もあるでしょう。
*loop_once()っていう1回だけ描画っていう関数もあります。

ifをつかって、10フレームだけ円を、11フレーム目から四角を描いて…。とフレームの数によって変化を持たせるのもまた面白いでしょう。

フレームは更新ごとに上に上に塗り重ねるので、フレーム数を活用して、重ねたイラストを作るなんてのもできるんじゃないでしょうか?

この3つの方法。どれを使っても円を思った数描けます。ただ、その裏の処理は少し違います。どれをつかうかどう使うか、どう組み合わせるか、考えるとわくわくしますね(^0^)

ではまた!

コメント

タイトルとURLをコピーしました