DirectXを使おう第4回改めDirectXスクリーンセーバー3分クッキングの巻
前回「ゲームを1本作るくらいのつもりでプログラム例を」と言ったのですが、予定を変更してDirectXでスクリーンセーバーの作り方の説明です。あらかじめ断っておきますが、スクリーンセーバーは3分じゃ作れないと思います。というか3分では無理です。あくまでも「簡単にできる」と言うことのたとえですので、「14分23秒かかったぞ、ウソつき!!」とか文句言われても困ります(^^;。キューピー3分クッキングも3分で作ってないので。
●作り方〜
DirectXでスクリーンセーバーを作るには、当然のことながら最低でもDirectXとプラグイン(HSPDX.DLL)が必要になります。さて、それがあるのならば作り方にはいるわけですが、DirectXプラグインと一緒にスクリーンセーバーのサンプルがありますので今回はそれを改造して作ることにします。うわ、手抜き。
それでは改造するポイントをラベル単位で示すことにしましょう。
*sscfg
サンプルではタイトルを表示しているだけですが、必要に応じて著作権表示を自分の名前に変えたりオブジェクトを使って設定を行うようにしたりしましょう。言うまでもないですが、終了するときに設定をbsaveで保存しないと無意味です。
onexit *cfgend alloc FLIST,20000 str FLIST dirlist FLIST,"hogehoge.ini" FILES=stat if FILES=0 : (ここにデフォルト値などを書く) (各種設定の処理を書く) *cfgend bsave"hogehoge.ini",cfg end |
*sspre
スプライト移動関係の命令を使っている場合、DirectXプラグインがウィンドウ描画に対応していないうちは処理が面倒なので、とりあえずこのままにしておいてもかまいません。
*ssproc、*start
ここからがスクリーンセーバー本体の準備となります。*ssprocのほうは画面解像度を変える程度ですが、*startは画像を読み込んでいるのでここを変えないと全く意味がありません。
読み込む画像が多くてすべてをVRAMに保存している場合は、オフスクリーンバッファを確保するごとに正常終了したかどうか確認しましょう。そういうときふつうはメインメモリも使用するものですが。
*sudden
スクリーンセーバーのメインです。つまりここは絶対書き換える箇所ってことです。最初の2行はエディタから実行したときの脱出装置ですので消してはいけません。消してもAlt+F4で強制終了できますが、あまりいいものではありません。
元々ラベルが少ないこともあって結局ほぼすべてのラベルについて変更点があることになってしまいましたが、最低でも*ssprocより後をいじればスクリーンセーバーはできます。
●調理例
つうことで、サンプルです。
一つ目は、Windows95に標準でついてる「宇宙」のようなスクリーンセーバーです。
es_size 8,8 a=5 repeat 4 es_pat cnt,cnt*8,0,a a=12 loop es_pat 4,32,0,0 |
repeat 2 es_new ns,0 rnd s,600 s+=300 rnd a,64 es_set ns,319,239,0 es_adir ns,a,s loop es_draw |
仕組みは至って簡単。まず最初に星のグラフィックをスプライトで登録するのですが、このとき立体感を出すためにグラフィックを4段階用意し、es_patでアニメーションさせるようにしています。そしてメイン処理で1フレームごとにスプライトを新規登録し、ランダムな方向へ移動するようにして出来上がりです。スプライトの初期座標が画面中央に固定なので常に中央に点が表示されている状態にならないようにすべて透明のグラフィックを最初に表示しています。
ちなみにこれを改造すると「2D縦スクロールシューティングの星」になります。
続いて「噴水(もどき)」です。なめらかに色を変えながら噴き出す水(?)が特徴なり。
count=0 z=1 y=480 w=-8 v=0 (中略) if v=0 : goto *w2 w+=v if(w=8)|(w=-8) : v=-v y+=w goto *wset *w2 y-=8 : if y<80 : v=1 goto *wset *wset repeat 8 es_new ns,0 rnd s,500 s++ rnd a,32 a+=16 es_set ns,319,y,count/4 es_adir ns,a,s rnd t,16 es_flag ns,$8710+t loop es_draw es_sync 33: await 0 count+=z if(count=0)|(count=840) : z=-z |
ちょこっと演出に凝っているので長めですが、*wsetより前は読み飛ばしてくれてかまいません。えーっとこれも宇宙と同様にスプライトをたくさん出しているだけです。宇宙と違って重力の概念が必要になるのでes_flagで自由落下をONにして水を落としているわけです。このままだと画面内にスプライトが残るのでタイマーをつけて数フレーム後に消滅するようにしています。色の変化はあらかじめ色の違う水の絵をたくさん作っておいてキャラクタに登録し、変数をカウントして表示するキャラクタを変えることで実現しています。
結構このスクリーンセーバーきれいなので、環境ソフトとしてもいいよね:-)。
というわけでこれらのスクリーンセーバーはここにアップしてありますので、一度動いているところをみておきましょう。
●最後に
サンプルプログラムを改造して作ると著作権の方はどうなんでしょう(^^;。最大の不安はそこだったりします。
あと、連動企画にする意味はなんなんでしょうねえ(^^;;。