はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン9βをご提供いただいたので、新機能であるキャンバスのグラフィックス機能についてなにかやってみることにしました。
前の記事では140の小さな円を使って雪っぽいグラフィックを試してみました。@killyさんのコメントによるとMind9βのキャンバス上の図形は移動させた方がはやいかもとのお話をいただきましたのでさっそく書き換えてみました。
解説
「雪片」の構造体
「雪片」の構造体は下記のように記述しました。今回は 図形IDを構造体のメンバとしたところがポイントです。
雪の数は 定数 7。
雪片は 構造体
円IDは 図形ID
Y座標は 変数
速度は 変数
雪片本体は 円IDと Y座標と 速度
全体は 雪の数の 雪片本体。
これを最初に乱数を使って下記のように初期化します。雪片初期化値を返すは前回と同じで、乱数によって生成された座標を返していますが、その値を使って図形IDを初期設定してしまいます。Y座標と速度は端に来た場合の判定用に構造体メンバとしても保持します。
全ての雪片を初期化するとは
Xは 変数
Rは 変数
20170316を 乱数種値に 入れ
雪の数で 回数指定し
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
Rに 入れ
Y座標(回数)に 入れ
xに 入れ
キャンバスと Xと Y座標(回数)と Rで 円のIDを取得し 円ID(回数)に 入れ
繰り返す。
乱数は引き続きQiitaユーザー@t-tkd3aさんの下記の記事のソースを利用させていただいております。Mind9の「評価した値」によるTcl乱数を使ってもよいのですが、ここはひとまず同条件ということで。
そして「雪の描く位置を更新する」では、今回、座標を変更するだけでなく図形IDをここで移動させています。ここがキモ。
雪の描く位置を更新するとは
Xは 変数
Yは 変数
Rは 変数
雪の数で 回数指定し
Y座標(回数)に 速度(回数)を 加え Yに 入れる
Yが キャンパス高 以下
ならば
Yを Y座標(回数)に 入れる
雪片を少し揺らし xに 入れる
円ID(回数)を xと 速度(回数)で 図形を移動し
さもなければ
Y座標(回数)を Yに 入れる
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
Rに 入れ
Y座標(回数)に 入れ
xに 入れる
円ID(回数)を xと Yで 図形を移動し
つぎへ
繰り返す。
通常の描画は最初だけとなります。
雪片を描くとは
_回数は 変数
_回数に 入れる
白色で 円ID(_回数)に 満たす色を設定し
円ID(_回数)を 描画すること。
雪の降る様子を描くとは
雪の数で 回数指定し
回数で 雪片を描く
繰り返す。
メイン処理の構造
こうして、メインは下記のようになります。今回は引き続き「遅延」を使ってループさせています。キャンバスクリアは不要となりました。これによりキャンバスクリアしないことによる累積的に図形IDが増えていくためと推定される描画遅延は解消されるものと推定されます。
キャンバスは ID。
キャンパス幅は 定数 800。
キャンパス高は 定数 400。
メインは
メインウィンドウと キャンパス幅と キャンパス高と 黒色で
キャンバスを立て キャンバスに 入れ
全ての雪片を初期化する
雪の降る様子を描く
ここから
10ミリ秒で 遅延
雪の描く位置を更新する
繰り返す。
遅延時間も前回より10倍確保しています。
実行イメージ
実行時の様子は下記の感じです。だいぶするする感がでてきましたね
ウィンドウの下端に到達したときに座標をリセットすることがまだできていません。GIFアニメの場合ループしているように見えるのは単にGIF再生がループしているからです。
構造体に格納できる図形の数が最大7に制限されているような印象がありますが、これはもしかしたらβ由来の制限かもしれません。このため、元の小さな雪ですと動きがわかりにくいため、少し大きくしています。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!
参考情報
ソースコード全文
"random.src"を コンパイル。
キャンバスは ID。
キャンパス幅は 定数 800。
キャンパス高は 定数 400。
雪の数は 定数 7。
雪片は 構造体
円IDは 図形ID
Y座標は 変数
速度は 変数
雪片本体は 円IDと Y座標と 速度
全体は 雪の数の 雪片本体。
雪片初期化値を返すとは (変数 → 変数、変数、変数、変数)
Xは 小数変数
Yは 小数変数
Rは 小数変数
Sは 小数変数
キャンバスサイズ幅は 変数
キャンバスサイズ幅に 入れ
キャンバスサイズ幅に 小数化し ガウス分布乱数(0.5,0.4)を f掛けて Xに 入れる
50と 小数化し ガウス分布乱数(0.5,0.4)を f掛けて Yに 入れる
20と 小数化し 一様乱数()を f掛けて Rに 入れる
2と 小数化し ガウス分布乱数(0.8,0.3)を f掛けて Sに 入れる
Sが 1.0より f以下
ならば
1.0を Sに 入れ
つぎに
Xを 整数化
Yを 整数化
Rを 整数化
Sを 整数化。
雪片を描くとは
_回数は 変数
_回数に 入れる
白色で 円ID(_回数)に 満たす色を設定し
円ID(_回数)を 描画すること。
全ての雪片を初期化するとは
Xは 変数
Rは 変数
20170316を 乱数種値に 入れ
雪の数で 回数指定し
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
Rに 入れ
Y座標(回数)に 入れ
xに 入れ
キャンバスと Xと Y座標(回数)と Rで 円のIDを取得し 円ID(回数)に 入れ
繰り返す。
雪片を少し揺らすとは
Xは 小数変数
-2を 小数化し 一様乱数()を f掛けて Xに 入れ
Xを 整数化。
雪の描く位置を更新するとは
Xは 変数
Yは 変数
Rは 変数
雪の数で 回数指定し
Y座標(回数)に 速度(回数)を 加え Yに 入れる
Yが キャンパス高 以下
ならば
Yを Y座標(回数)に 入れる
雪片を少し揺らし xに 入れる
円ID(回数)を xと 速度(回数)で 図形を移動し
さもなければ
Y座標(回数)を Yに 入れる
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
Rに 入れ
Y座標(回数)に 入れ
xに 入れる
円ID(回数)を xと Yで 図形を移動し
つぎへ
繰り返す。
雪の降る様子を描くとは
雪の数で 回数指定し
回数で 雪片を描く
繰り返す。
メインは
メインウィンドウと キャンパス幅と キャンパス高と 黒色で
キャンバスを立て キャンバスに 入れ
全ての雪片を初期化する
雪の降る様子を描く
ここから
10ミリ秒で 遅延
雪の描く位置を更新する
繰り返す。