LoginSignup
6
1

More than 3 years have passed since last update.

クリスマスといえばxsnow

Last updated at Posted at 2019-12-01

初めて,Qiitaに記事をアップしてみます.

初めに

なぜ今xsnowを紹介しようと考えたかというと,20年前のワークステーションでは処理が重く動作せず,研究室で動かすと叱られたものです.しかし,最近のPCであれば動かしても問題ないのではないかと考えます.
また,仕事の中で雪のシミュレーションが求められ,そういえばxsnowはどんなコードなのだろうと思い,今回簡単にまとめることにしました.
FreeBSDとは直接関係はありませんが,インストールでPortsから行なうことができることなど参考になればと考えます.

インストール

今回は,コードも確認したため,portsを使いました.
次のパスにMakefileがありますので,makeします.


/usr/ports/x11/snów

使用方法

使用方法は,manコマンドで全てのオプションなど確認いただきたいのですが,今回は少しだけ紹介します.


-snowflakes 降雪する雪の量を設定します.1000が最大です.
-santa サンタの表示サイズを設定します.0から3までの数字を入力します.
-santaspeed サンタの移動速度を設定します.

コードで勉強になること

コードは1500行程度なので比較的簡単に確認することができます.

まず,ヘッダファイルのxsnow.hから見ます.

最初に,定数の宣言があります.例えば,MAXSNOWFLAKESの値を変更すれば表示する雪の数を多くすることができると考えます.

define MAXSNOWFLAKES 1000 /* Max no. of snowflakes /
define INITIALSNOWFLAKES 100 /
Initial no. of snowflakes */

雪の粒子の構造体を次のように作成しています.座標だけでなく.xStep,yStepにより速度量も持っています.そして雪が有効なのか表示されているのかなどのフラグをもっています.

typedef struct Snow {
int intX;
int intY;
int xStep; /* drift /
int yStep; /
falling speed */
int active;
int visible;
int insnow;
int whatFlake;
} Snow;

そのほかリソースなどの宣言が書かれています.

次に,snow.cを見ます.
最初Xウィンドウ表示に関わる処理がありますが,今回はスルーします.
次の箇所で,最初に雪の座標の初期化を行なっています.

for (i=0; i<maxSnowflakes; i++) InitSnowflake(i);

そして,次の箇所でサンタの初期化も行います.

ResetSanta();

while(!done)の無限ループの中で,次のように雪の座標計算とサンタの座標計算を行い,
その後画面に表示するという単純なプログラムです.

for (i=0; i<maxSnowflakes; i++) UpdateSnowflake(i);

if ((RunCounter % SantaUpdateFactor) == 0) UpdateSanta();

特に,UpdateSnowFlake関数内の処理は業務で参考になりそうです.

最後に

クリスマスまでまだ日はありますが,xsnowを動かしてみてはいかがでしょうか.

6
1
0

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
6
1