はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン9βをご提供いただいたので、新機能であるキャンバスのグラフィックス機能についてなにかやってみることにしました。
前の記事 ではラインアートっぽいのになりましたが、今回は日本語プログラミング言語界隈ではやっている?雪をふらせるに挑戦してみます。
前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6
どうやって降らせるの?
日本語プログラミング言語界隈では雪の結晶っぽいのをひらひらさせたりとかすごいのがありますが、今回はちょっとそこまではムリ
とりあえず乱数をつかって雪片(っぽい白い円)の直径と座標と下降位置差分を計算して、Mind9βのキャンバスに描画してみることにしました。
解説
「雪片」の構造体
「雪片」の構造体は下記のように記述しました。
雪の数は 定数 140。
雪片は 構造体
X座標は 変数
Y座標は 変数
半径は 変数
速度は 変数
雪片本体は X座標と Y座標と 半径と 速度
全体は 雪の数の 雪片本体。
これを最初に乱数を使って下記のように初期化します。
"random.src"を コンパイル。
キャンパス幅は 定数 800。
雪片初期化値を返すとは (変数 → 変数、変数、変数、変数)
Xは 小数変数
Yは 小数変数
Rは 小数変数
Sは 小数変数
キャンバスサイズ幅は 変数
キャンバスサイズ幅に 入れ
キャンバスサイズ幅に 小数化し ガウス分布乱数(0.5,0.4)を f掛けて Xに 入れる
50と 小数化し ガウス分布乱数(0.5,0.4)を f掛けて Yに 入れる
3と 小数化し 一様乱数()を f掛けて Rに 入れる
2と 小数化し ガウス分布乱数(0.8,0.3)を f掛けて Sに 入れる
Sが 1.0より f以下
ならば
1.0を Sに 入れ
つぎに
Xを 整数化
Yを 整数化
Rを 整数化
Sを 整数化。
全ての雪片を初期化するとは
20170316を 乱数種値に 入れ
雪の数で 回数指定し
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
半径(回数)に 入れ
Y座標(回数)に 入れ
x座標(回数)に 入れ
繰り返す。
乱数はQiitaユーザー@t-tkd3aさんの下記の記事のソースを利用させていただいております。
メイン処理の構造
ここでメインについて解説いたします。
まずメインウィンドウにキャンバスを展開した後、先の「全ての雪片を初期化する」で雪片構造体を初期化します。
つづいて、その初期値で雪片を描画します。この定義はこの後ご説明いたします。初回の雪片描画の後は、ループに入ってまずちょこっとディレイをかけた後、キャンバスをクリアして、雪片構造体の位置などを更新して雪片を描画、これを繰り返すというわりとシンプルなつくりです。
キャンバスは ID。
キャンパス幅は 定数 800。
キャンパス高は 定数 400。
メインは
メインウィンドウと キャンパス幅と キャンパス高と 黒色で
キャンバスを立て キャンバスに 入れ
全ての雪片を初期化する
雪の降る様子を描く
ここから
1ミリ秒で 遅延
キャンバスで キャンバスをクリアし
雪の描く位置を更新し
雪の降る様子を描く
繰り返す。
雪片構造体の位置などを更新する処理
雪片構造体の位置などを更新する処理は下記の感じです。Y座標がキャンバス高さを超えたらリセットしています。x座標(回数)は乱数で若干調整しています。プラスマイナスの乱数の出し方がいまのところわかってなくて(ガウス分布乱数の平均値を0にすればいける?)微妙に左に流れていく動きとなっています。+にすれば右に流れていく感じになります。
雪片を少し揺らすとは
Xは 小数変数
-2を 小数化し 一様乱数()を f掛けて Xに 入れ
Xを 整数化。
雪の描く位置を更新するとは
Yは 変数
雪の数で 回数指定し
Y座標(回数)に 速度(回数)を 加え Yに 入れる
Yが キャンパス高 以下
ならば
Yを Y座標(回数)に 入れる
雪片を少し揺らし x座標(回数)を 加え x座標(回数)に 入れる
さもなければ
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
半径(回数)に 入れ
Y座標(回数)に 入れ
x座標(回数)に 入れる
つぎへ
繰り返す。
雪片を描画する処理
雪片を描画する処理は下記のとおりです。
雪片を描くとは
_円IDは 図形ID
Xは 変数
Yは 変数
Rは 変数
Xに 入れる
Yに 入れる
Rに 入れる
キャンバスと Xと Yと Rで 円のIDを取得し _円IDに 入れる
白色で _円IDに 満たす色を設定し
_円IDを 描画すること。
雪の降る様子を描くとは
雪の数で 回数指定し
半径(回数)と Y座標(回数)と x座標(回数)で 雪片を描く
繰り返す。
実行イメージ
実行時の様子は下記の感じです。
乱数の持たせ方で動かし方はいろいろ変えれると思います。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!
参考情報
ソースコード全文
"random.src"を コンパイル。
キャンバスは ID。
キャンパス幅は 定数 800。
キャンパス高は 定数 400。
雪の数は 定数 140。
雪片は 構造体
X座標は 変数
Y座標は 変数
半径は 変数
速度は 変数
雪片本体は X座標と Y座標と 半径と 速度
全体は 雪の数の 雪片本体。
雪片初期化値を返すとは (変数 → 変数、変数、変数、変数)
Xは 小数変数
Yは 小数変数
Rは 小数変数
Sは 小数変数
キャンバスサイズ幅は 変数
キャンバスサイズ幅に 入れ
キャンバスサイズ幅に 小数化し ガウス分布乱数(0.5,0.4)を f掛けて Xに 入れる
50と 小数化し ガウス分布乱数(0.5,0.4)を f掛けて Yに 入れる
3と 小数化し 一様乱数()を f掛けて Rに 入れる
2と 小数化し ガウス分布乱数(0.8,0.3)を f掛けて Sに 入れる
Sが 1.0より f以下
ならば
1.0を Sに 入れ
つぎに
Xを 整数化
Yを 整数化
Rを 整数化
Sを 整数化。
雪片を描くとは
_円IDは 図形ID
Xは 変数
Yは 変数
Rは 変数
Xに 入れる
Yに 入れる
Rに 入れる
キャンバスと Xと Yと Rで 円のIDを取得し _円IDに 入れる
白色で _円IDに 満たす色を設定し
_円IDを 描画すること。
全ての雪片を初期化するとは
20170316を 乱数種値に 入れ
雪の数で 回数指定し
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
半径(回数)に 入れ
Y座標(回数)に 入れ
x座標(回数)に 入れ
繰り返す。
雪片を少し揺らすとは
Xは 小数変数
-2を 小数化し 一様乱数()を f掛けて Xに 入れ
Xを 整数化。
雪の描く位置を更新するとは
Yは 変数
雪の数で 回数指定し
Y座標(回数)に 速度(回数)を 加え Yに 入れる
Yが キャンパス高 以下
ならば
Yを Y座標(回数)に 入れる
雪片を少し揺らし x座標(回数)を 加え x座標(回数)に 入れる
さもなければ
キャンパス幅で 雪片初期化値を返し
速度(回数)に 入れ
半径(回数)に 入れ
Y座標(回数)に 入れ
x座標(回数)に 入れる
つぎへ
繰り返す。
雪の降る様子を描くとは
雪の数で 回数指定し
半径(回数)と Y座標(回数)と x座標(回数)で 雪片を描く
※回数 20 100 雪片を描く
※半径(回数)と 数値表示 空白表示
※Y座標(回数)と 数値表示 空白表示
※x座標(回数)で 数値表示 改行
繰り返す。
メインは
メインウィンドウと キャンパス幅と キャンパス高と 黒色で
キャンバスを立て キャンバスに 入れ
全ての雪片を初期化する
雪の降る様子を描く
ここから
1ミリ秒で 遅延
キャンバスで キャンバスをクリアし
雪の描く位置を更新し
雪の降る様子を描く
繰り返す。