いまやTVゲームというのは、子供だけのおもちゃとしてでなく、大人でも遊べるものとして広く一般に普及していますね。私はTVゲームでほとんど遊んだことがないのですが、私の兄弟がゲーム好きでして、PlayStation1,2、Dreamcast、スーパーファミコン、ゲームボーイ、などなど、さまざまなゲーム機があります。
そこで、今回は、ゲーム作りの基本を解説してみたいと思います。ゲームと言っても、いろいろありますが、今回は、迷宮をさ迷う迷路ゲームを作ってみましょう。これが、はまるんですよね。
ゲームを作るのは、なかなか難しいことです。迷路ゲームに限って言っても、まず、マップ(迷宮のデータ)を読み込み、データ通りに画面に表示し、キャラクターの移動。キーボードからの入力。座標の計算。ゲームデータの保存などなど。よって、この解説では、基本的なひまわりの文法を一通りマスターしているものとして進めていきます。
まずは、マップ(迷宮の構造)データを作成しましょう。
普通マップは、数値で表現します。
「1」が壁。「0」が通路を表しています。
1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,1,0,0,1,1
1,0,1,0,0,0,0,0,0,1
1,0,1,0,1,0,0,1,0,1
1,0,1,0,1,0,0,1,1,1
1,0,0,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1
これが、まず、どんな感じになるのか、とりあえず、文字情報として表示してみましょう。
1と0が、そのまま表示されました。
文字をそのまま表示する簡単なマップ表示 マップ=「1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,1,0,0,1,1
1,0,1,0,0,0,0,0,0,1
1,0,1,0,1,0,0,1,0,1
1,0,1,0,1,0,0,1,1,1
1,0,0,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1」。
文字サイズは、12
XXを、0から、9まで、繰り返す(
YYを、0から、9まで、繰り返す(
(XX*20,YY*20)へ、移動。
(マップ#XX#YY)を、表示。
)
)。
なんとなく、迷路っぽい感じはしますね。それでは、この1の部分を、「■」と、0の部分を、「 」と、表示させてみてはどうでしょうか。
*1の部分は、配列が多重構造になっていてちょっと分かりづらいと思いますが、マップ#XX#YYの値が、0ならば、表示字#0、即ち、「 」を表示します。もし、値が1ならば、表示字#1、即ち。「■」を、表示するということです。
数字を文字に置き換えて表示するマップ表示 マップ=「1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,1,0,0,1,1
1,0,1,0,0,0,0,0,0,1
1,0,1,0,1,0,0,1,0,1
1,0,1,0,1,0,0,1,1,1
1,0,0,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1」。
表示字#0=「 」
表示字#1=「■」
文字サイズは、12
XXを、0から、9まで、繰り返す(
YYを、0から、9まで、繰り返す(
(XX*20,YY*20)へ、移動。
(表示字#(マップ#XX#YY))を、表示。’*1
)
)。
ここまで出来たら、後は、文字で表示していた迷宮を、画像ファイルに置き換えてやれば、ぐっとそれらしくなります。ここでは、ひまわりの、"sample"フォルダの中の、"demo"フォルダにある、画像ファイルを使ってプログラムしていきます。
迷路マップを画像で表示 *迷路データ設定
マップ=「1,1,1,1,1,1,1,1,1,1
1,0,0,0,0,1,0,0,1,1
1,0,1,0,0,0,0,0,0,1
1,0,1,0,1,0,0,1,0,1
1,0,1,0,1,0,0,1,1,1
1,0,0,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1」。
*画像の読み込み
壁イメージを、イメージとして、作成。
その、画像は、ランタイムのパス&『sample\demo\map1.png』
その、可視は、オフ。'マップ表示用画像データなので。
マップ幅 = 25
XXを、0から、9まで、繰り返す(
YYを、0から、9まで、繰り返す(
もし、マップ#XX#YYが、1ならば(
壁イメージを,母艦の,(XX*マップ幅,YY*マップ幅)に,
イメージコピー。
)。
)
)。
さて、上のマップ表示は、ただ、壁があるかないかだけでしたが、壁以外のいろいろなオブジェを並べてみましょう。そして、それをスクロールさせましょう。
迷路マップ表示(スクロール版) {迷路の表示}
白色で、画面クリア。
*画像の読み込み
イメージ0を、イメージとして、作成。'道
その、サイズは、(0,0,32,32)
塗り色は、白色。ペン色は、白色。
イメージ0の、(0,0)から,(31,31)へ,四角形描画。
その、可視は、オフ。'マップ表示用画像データなので。
イメージ1を、イメージとして、作成。'壁
その、画像は、ランタイムのパス&『sample\demo\kabe.png』
その、可視は、オフ。'マップ表示用画像データなので。
イメージ2を、イメージとして、作成。'宝
その、画像は、ランタイムのパス&『sample\demo\takara.png』
その、可視は、オフ。'マップ表示用画像データなので。
イメージ3を、イメージとして、作成。'噴水
その、画像は、ランタイムのパス&『sample\demo\water.png』
その、可視は、オフ。'マップ表示用画像データなので。
イメージ4を、イメージとして、作成。'旗
その、画像は、ランタイムのパス&『sample\demo\flag.png』
その、可視は、オフ。'マップ表示用画像データなので。
キャライメージを、イメージとして、作成。
その、画像は、ランタイムのパス&『sample\demo\char.png』
その、サイズは、(64,64,96,96);
*変数設定
マップ幅 = 32
CX=1; CY=1; 'キャラクターの座標
母艦の、キー押した時を、キーイベントに、設定。
左キー = 37
上キー = 38
右キー = 39
下キー = 40
ランタイムのパス&『sample\demo\map2.txt』を、開く。MAP=それ。
*マップ描画
母艦の、テキストは、「母艦{CX},{CY}|EVENT={MAP#CX#CY}」
XXを、0から、4まで、繰り返す(
YYを、0から、4まで、繰り返す(
PX=CX+XX-2; PY=CY+YY-2;
もし、(PX>=0)かつ(PY>=0)ならば(
イベント番号は、MAP#PX#PY。
)違えば(イベント番号=0)。
もし、イベント番号=「」ならば、イベント番号=0
X2=XX×マップ幅。Y2=YY×マップ幅。
X3=X2+マップ幅。Y3=Y2+マップ幅。
「イメージ{イベント番号}を,母艦の,(X2,Y2,X3,Y3)に,イメージコピー。」を,
ひまわりする。
)。
)。
キャライメージを,水平反転。
待機。
*キーイベント
前のX = CX;前のY = CY;
もし、押されたキーが、左キーなら、CX = CX - 1。
もし、押されたキーが、右キーなら、CX = CX + 1。
もし、押されたキーが、上キーなら、CY = CY - 1。
もし、押されたキーが、下キーなら、CY = CY + 1。
{マップのイベント取得}
もし、(CX >= 0)かつ(CY >= 0)ならば、C = MAP#CX#CY。
違えば、C = 0。
もし、(C = 1)なら(
CX = 前のX;CY = 前のY;ランタイムのパス&『tools\ki.wav』を、演奏。
)違えば(
ランタイムのパス&『tools\pi.wav』を、演奏。
)。
マップ描画へ、飛ぶ。
上のプログラムにちょっと手を加えただけですが、以下のプログラムでは、イベントを判断する部分を加えました。また、一歩歩くと体力が減り、噴水で水を飲むと体力が回復するというゲーム要素も取り入れてみました。
迷路マップ表示イベント判断付き {迷路の表示}
母艦の、タイトルは、「迷路ゲーム」
白色で、画面クリア。
*画像の読み込み
イメージ0を、イメージとして、作成。'道
その、サイズは、(0,0,31,31)
塗り色は、白色。ペン色は、白色。
イメージ0の、(0,0)から,(31,31)へ,四角形描画。
その、可視は、オフ。'マップ表示用画像データなので。
イメージ1を、イメージとして、作成。'壁
その、画像は、ランタイムのパス&『sample\demo\kabe.png』
その、可視は、オフ。'マップ表示用画像データなので。
イメージ2を、イメージとして、作成。'宝
その、画像は、ランタイムのパス&『sample\demo\takara.png』
その、可視は、オフ。'マップ表示用画像データなので。
イメージ3を、イメージとして、作成。'噴水
その、画像は、ランタイムのパス&『sample\demo\water.png』
その、可視は、オフ。'マップ表示用画像データなので。
イメージ4を、イメージとして、作成。'旗
その、画像は、ランタイムのパス&『sample\demo\flag.png』
その、可視は、オフ。'マップ表示用画像データなので。
キャライメージを、イメージとして、作成。
その、画像は、ランタイムのパス&『sample\demo\char.png』
その、サイズは、(64,64,96,96);
(10,300)へ、移動。
情報ラベルを、ラベルとして、作成。
その、テキストは、「迷路ゲーム」
*変数設定
マップ幅 = 32
CX=1; CY=1; 'キャラクターの座標
所持金=0
体力=500'一歩歩くと、体力が1減る
左キー = 37
上キー = 38
右キー = 39
下キー = 40
ランタイムのパス&『sample\demo\map2.txt』を、開く。MAP=それ。
*マップ描画
情報ラベルの、テキストは、「座標({CX},{CY})。体力={体力}。所持金={所持金}。」
XXを、0から、4まで、繰り返す(
YYを、0から、4まで、繰り返す(
PX=CX+XX-2; PY=CY+YY-2;
もし、(PX>=0)かつ(PY>=0)ならば(
イベント番号は、MAP#PX#PY。
)違えば(
イベント番号=0
)。
もし、イベント番号=「」ならば、イベント番号=0
X2=XX×マップ幅。Y2=YY×マップ幅。
X3=X2+マップ幅。Y3=Y2+マップ幅。
「イメージ{イベント番号}を,母艦の,(X2,Y2,X3,Y3)に,イメージコピー。」を,
ひまわりする。
)。
)。
キャライメージを,水平反転。
母艦の、キー押した時を、キーイベントに、設定。
待機。
*キーイベント
母艦の、キー押した時を、未定義に、設定。
前のX = CX;前のY = CY;
もし、押されたキーが、左キーなら、CX = CX - 1。
もし、押されたキーが、右キーなら、CX = CX + 1。
もし、押されたキーが、上キーなら、CY = CY - 1。
もし、押されたキーが、下キーなら、CY = CY + 1。
{マップのイベント取得}
もし、(CX >= 0)かつ(CY >= 0)ならば、C = MAP#CX#CY。
違えば、C = 0。
もし、(C = 1)なら(
CX = 前のX;CY = 前のY;母艦のパス&『tools\ki.wav』を、演奏。
)違えば(
ランタイムのパス&『tools\pi.wav』を、演奏。
体力から、1を、引く。
もし、体力<=0ならば(
「体力が、0になりました。ゲームオーバー」と、言う。おわり。
)。
)。
もし、C=2ならば(
「宝をとりました。所持金+10」と、言う。
所持金に、10を、足す。
MAP#CX#CY=0
)。
もし、C=3ならば(
「水を飲みました。体力+100」と、言う。
体力に、100を、足す。
MAP#CX#CY=0
)。
もし、C=4ならば(
「ゲームクリアー!おめでとう!」と、言う。おわり。
)。
マップ描画へ、飛ぶ。
こんな調子で、敵が出るようにしたり、もっといろいろなイベントを増やしていけば、本格的な迷路ゲームが作れることと思います。