前回までは、どんな感じのゲームを作るのかさえ分かりませんでした。
しかし、今回からはどんどん開発していきたいと思います。
このシューティングゲームが完成すると、こんな感じになる予定です。

完成画面
どうですか? 敵も何機か出現し、少しレベルの高いものになっています。
敵データの管理など、このプログラムで得るものは大きいと思います。
DirectXは使っていません。すべてHSPの標準命令です。
さて今回は、自機を表示し、動かせるようにしましょう。
( ※プレイヤーが動かす機体のことを自機と呼ぶことにします。 )
まずは、自機の座標をあらわす変数を初期化します。
#const wx 300
#const wy 200
#const mysizex 30 //自機の大きさX (MySizeX)
#const mysizey 20 //自機の大きさY
//変数初期化
myx=0 : myy=0 //自機の位置
screen 0,wx,wy
*main
redraw 0
gosub *draw ;描画ルーチン
redraw 1
await 5
goto *main
*draw
color 255,255,255 : boxf ;背景
pos 55,20
color : mes "シューティングゲーム(仮)"
return
myxとmyyは自機の位置を表す変数です。自分の機体に関係する変数には、「my」をつけることにします。
このほうが分かりやすいからです。また、敵に関係する変数には、「e」(enemyの意)をつけることにします。
mysizexは自機の大きさを表します。これは、変更されることがないので#constで宣言します。
自機を表示させるために、画像ファイルを使います。
このファイルは今後使っていくのでスクリプトのディレクトリにおいてください。
[Download]char.gif gifファイルです。本当はbmpファイルのほうがいいです(^^;
左から順番に、自機、敵機、弾が描いてあります。(ヘボい絵ですが)
黒いところが多いですが、これには大きな秘密があります。
サンプルを見てみましょう。
#const wx 300
#const wy 200
#const mysizex 30 //自機の大きさX (MySizeX)
#const mysizey 20 //自機の大きさY
//変数初期化
myx=0 : myy=0 //自機の位置
buffer 2 //キャラデータバッファ
picload "char.gif" //キャラ画像をロード
screen 0,wx,wy
gmode 2 //黒を透明色に (黒色は、gcopyでコピーされなくなる)
*main
redraw 0
gosub *draw //描画ルーチン
redraw 1
await 5
goto *main
*draw
color 255,255,255 : boxf //背景
pos 55,20
color : mes "シューティングゲーム(仮)"
pos 0,0 : gcopy 2,0,0,mysizex,mysizey //自機を表示
return
まずはバッファ2にchar.gifを読み込んでいます。
ここでエラーが出る人は画像ファイルの位置を確かめてください。
そして、重要なのが、「gmode 2」です。
これは、コピーする際「色がR0,G0,B0」のところはコピーするなということを設定しています。
色が0,0,0の場所はコピーされません、つまり、その部分が透明になります。
じつは、char.gifも同じ黒に見えても、色0,0,0の部分と、色1,1,1の部分があります。
色が0,0,0の部分はコピーされません。何回も言いますが、これが重要なポイントです。
「gcopy 2,0,0,mysizex,mysizey」で、X0,Y0の場所にコピーすると、自機が表示されます。
これで自機が表示されますが、移動はできません。移動は次回にやりましょう。
さて、次は背景を表示させましょうか。
これは今まで*drawで描いてたのを、バッファに描くだけです。
#const wx 300
#const wy 200
#const mysizex 30 //自機の大きさX (MySizeX)
#const mysizey 20 //自機の大きさY
//変数初期化
myx=0 : myy=0 //自機の位置
randomize
buffer 3,wx,wy //背景バッファ
color 1,1,1 : boxf //背景作成
color 255,255,255 : repeat 500 : pset rnd(wx),rnd(wy) : loop //星作成
pos 55,20 : color 255,255,255 : mes "シューティングゲーム(仮)" //別に必要ない描画処理
buffer 2 //キャラデータバッファ
picload "char.gif" //キャラ画像をロード
screen 0,wx,wy
gmode 2 //黒を透明色に (黒色は、gcopyでコピーされなくなる)
*main
redraw 0
gosub *draw //描画ルーチン
redraw 1
await 5
goto *main
*draw
pos 0,0 : gcopy 3,0,0,wx,wy //背景
pos 0,0 : gcopy 2,0,0,mysizex,mysizey //自機を表示
return
背景は宇宙・・・黒くします。
ですが、color 0,0,0ではコピーされませんので、1,1,1にします。
星はランダムに打ちます。「pset rnd(wx),rnd(wy)」でランダムに散らしています。
大雑把に見えますが、意外に綺麗に見えますね。
最終サンプルは上のものと同じです。