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にして水を落としているわけです。このままだと画面内にスプライトが残るのでタイマーをつけて数フレーム後に消滅するようにしています。色の変化はあらかじめ色の違う水の絵をたくさん作っておいてキャラクタに登録し、変数をカウントして表示するキャラクタを変えることで実現しています。
 結構このスクリーンセーバーきれいなので、環境ソフトとしてもいいよね:-)。

 というわけでこれらのスクリーンセーバーはここにアップしてありますので、一度動いているところをみておきましょう。

●最後に
 サンプルプログラムを改造して作ると著作権の方はどうなんでしょう(^^;。最大の不安はそこだったりします。
 あと、連動企画にする意味はなんなんでしょうねえ(^^;;。


戻る