初めて,Qiitaに記事をアップしてみます.
#初めに
なぜ今xsnowを紹介しようと考えたかというと,20年前のワークステーションでは処理が重く動作せず,研究室で動かすと叱られたものです.しかし,最近のPCであれば動かしても問題ないのではないかと考えます.
また,仕事の中で雪のシミュレーションが求められ,そういえばxsnowはどんなコードなのだろうと思い,今回簡単にまとめることにしました.
FreeBSDとは直接関係はありませんが,インストールでPortsから行なうことができることなど参考になればと考えます.
#インストール
今回は,コードも確認したため,portsを使いました.
次のパスにMakefileがありますので,makeします.
#コードで勉強になること
コードは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を動かしてみてはいかがでしょうか.