rust nannouでは、標準だと60フレーム前後で描画するようになってます。
実行してから、終了するまでずーっと描画し続けるのがディフォルトの設定です。
けど、「ここで止めたい!」っていうものもありますよね?
円は100個書いたらおしまいにしたい、それ以降は描画してほしくない!
そんな時にどうするか?
今回は10フレームだけ円(円を10個だけ)を描画するを例にして説明していきます。
10フレームだけで止めたい!(円を10個だけ)
10フレームだけ描く方法は、いくつかあります。今回は力業入れて3つ解説していきます。
結論から言うと、一番シンプルなのは、3番目の
loop_ntimes()
を使うことです。
これを含めて、例をあげます。
- forを使って10回データ作って、それを描き続ける(フレームは動き続ける)
- ifを使って、10フレーム以降描かない(フレームは動き続ける)
- 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^)
ではまた!
コメント