4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mind9βのキャンバスに雪(っぽいの)を降らしてみる

Last updated at Posted at 2025-01-12

はじめに

日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン9βをご提供いただいたので、新機能であるキャンバスのグラフィックス機能についてなにかやってみることにしました。

前の記事 ではラインアートっぽいのになりましたが、今回は日本語プログラミング言語界隈ではやっている?雪をふらせるに挑戦してみます。

前提条件

Windows11 Pro 22H2 22621.4169
mind version9-BETA-6 

どうやって降らせるの?

日本語プログラミング言語界隈では雪の結晶っぽい:snowflake:のをひらひらさせたりとかすごいのがありますが、今回はちょっとそこまではムリ:joy:

とりあえず乱数をつかって雪片(っぽい白い円)の直径と座標と下降位置差分を計算して、Mind9βのキャンバスに描画してみることにしました。

snowfall.png

解説

「雪片」の構造体 

「雪片」の構造体は下記のように記述しました。

snowfall.src
雪の数は 定数 140。

雪片は 構造体
        X座標は 変数
        Y座標は 変数
        半径は 変数
        速度は 変数
    雪片本体は X座標と Y座標と 半径と 速度
    全体は 雪の数の 雪片本体。

これを最初に乱数を使って下記のように初期化します。

snowfall.src
"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さんの下記の記事のソースを利用させていただいております。

メイン処理の構造

ここでメインについて解説いたします。
まずメインウィンドウにキャンバスを展開した後、先の「全ての雪片を初期化する」で雪片構造体を初期化します。
つづいて、その初期値で雪片を描画します。この定義はこの後ご説明いたします。初回の雪片描画の後は、ループに入ってまずちょこっとディレイをかけた後、キャンバスをクリアして、雪片構造体の位置などを更新して雪片を描画、これを繰り返すというわりとシンプルなつくりです。

snowfall.src
キャンバスは ID。
キャンパス幅は 定数 800。
キャンパス高は 定数 400。

メインは
    メインウィンドウと キャンパス幅と キャンパス高と 黒色で
              キャンバスを立て キャンバスに 入れ

    全ての雪片を初期化する

    雪の降る様子を描く
    ここから
        1ミリ秒で   遅延
        キャンバスで キャンバスをクリアし
        雪の描く位置を更新し
        雪の降る様子を描く
    繰り返す。

雪片構造体の位置などを更新する処理

雪片構造体の位置などを更新する処理は下記の感じです。Y座標がキャンバス高さを超えたらリセットしています。x座標(回数)は乱数で若干調整しています。プラスマイナスの乱数の出し方がいまのところわかってなくて(ガウス分布乱数の平均値を0にすればいける?)微妙に左に流れていく動きとなっています。+にすれば右に流れていく感じになります。

snowfall.src
雪片を少し揺らすとは
        Xは 小数変数
    -2を 小数化し 一様乱数()を f掛けて   Xに 入れ
    Xを 整数化。

雪の描く位置を更新するとは
        Yは 変数

    雪の数で 回数指定し
        Y座標(回数)に 速度(回数)を 加え Yに 入れる
        Yが キャンパス高 以下
        ならば
            Yを Y座標(回数)に 入れる
            雪片を少し揺らし x座標(回数)を 加え x座標(回数)に 入れる
        さもなければ
            キャンパス幅で 雪片初期化値を返し
            速度(回数)に 入れ
            半径(回数)に 入れ
            Y座標(回数)に 入れ
            x座標(回数)に 入れる
        つぎへ
    繰り返す。

雪片を描画する処理

雪片を描画する処理は下記のとおりです。

snowfall.src
雪片を描くとは
		_円IDは	図形ID
        Xは 変数
        Yは 変数
        Rは 変数
    
    Xに 入れる
    Yに 入れる
    Rに 入れる
    キャンバスと Xと Yと Rで 円のIDを取得し _円IDに 入れる
	白色で	_円IDに 満たす色を設定し
	_円IDを 描画すること。
 
雪の降る様子を描くとは
    雪の数で 回数指定し
        半径(回数)と Y座標(回数)と x座標(回数)で 雪片を描く
    繰り返す。

実行イメージ

実行時の様子は下記の感じです。

snowfall.gif

乱数の持たせ方で動かし方はいろいろ変えれると思います。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!

参考情報

ソースコード全文
snowfall.src
"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ミリ秒で   遅延
        キャンバスで キャンバスをクリアし
        雪の描く位置を更新し
        雪の降る様子を描く
    繰り返す。
4
3
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?