HSP3 ゲームのプログラミング | |
レース・ゲーム制作 |
ウインドウ上のコースをキャラクタがゴールを目指して移動する。ゲームとしては、1番になるキャラクタを当てるものである。キャラクタを車にすれば「カーレース」、人にすれば「陸上競技」、馬にすれば「競馬」、船にすれば「競艇」というように、いろいろなゲームに作り替えていくことができる。
(1) 計画・概要
円のキャラクタを8台用意して、直線コースを走らせる。
コースの幅を20ドット、ウィンドウの右から左に走行する。キャラクタは18ドットの正方形に内接する円として、キャラクタ同士がつかないようにする。
キャラクタの座標は配列chxにx座標、配列chyにy座標を格納する。ただし、この座標はウィンドウ上の座標とは別のものである。つまり、キャラクタはマス目を移動するイメージである。この座標(「マップ座標」と呼ぶことにする)を元に実際の座標を計算する。
xmax | xmax-1 | … | 2 | 1 | 0 | |||
0 | ||||||||
1 | ||||||||
… | ||||||||
ymax-1 | ||||||||
ymax |
例えば、マップ座標のxmax=99(100マス)、ymax=7(8マス)とする。ウィンドウ上のx座標600から100の間を移動させるとすると、次のような計算になる。
<x座標> 移動量 = 600-100 = 500ドット
マップ座標1当たりのドット数 = 500 ÷ 100 = 5ドット<y座標> コース幅 = 20ドット
マップ座標1当たりのドット数 = 20ドット
マップ座標とウィンドウ上の座標の変換式は次のようになる。
ウィンドウ上のx座標 = 600 - chx × 5、 ウィンドウ上のy座標 = chy × 20
このようにしておけば、ゲームとしてはキャラクタをマップ座標上で移動させるだけである。コースが直線でなくても変換式さえ適切に作れればどのようなコースの形でも対応できる。
処理の概要
(race01.hsp)
処理の概要に従ってプログラムする。
;race01.hsp screen 0, 640, 480 ;配列宣言、データ初期化 char_max = 8 dim chx, char_max dim chy, char_max foreach chx chx(cnt) = 0 chy(cnt) = cnt ;コース loop repeat redraw 0 color 255, 255, 255 : boxf ;画面消去 ;コース描画 color 0, 0, 0 repeat char_max + 1 y = cnt * 20 + 10 line 100, y, 600, y loop line 100, 10, 100, 170 line 600, 10, 600, 170 ;キャラクタ移動・ゴール判定 foreach chx x = 600 - chx(cnt) * 5 - 20 ;x座標変換 y = chy(cnt) * 20 + 10 ;y座標変換 hsvcolor cnt * 23, 255, 255 circle x + 2, y + 2, x + 18, y + 18 ;キャラクタ描画 chx(cnt) += 1 ;移動量加算 loop if chx(7) > 99 : break redraw 1 ;if ゴールした : break await 200 loop stop
8個のキャラクタが並んで進んでいく。
x方向には5ドット単位で移動させるので、x座標変換の式は、マス目の数(chx)×5で良い。しかし、実際にはx座標が600の位置から100の位置に移動させるので、600, 595, 590, 585…と減らしていかなければならない。そこで、600 - マス目の数×5で計算している。式の最後の-20はキャラクタの大きさ分である。
マス目 chx 0 1 2 3 … 98 99 chx × 5 0 5 10 15 … 490 495 600 - chx × 5 600 595 590 585 … 110 105
y方向はコースの幅に合わせて、マス目(chy)×20で計算している。
移動量は1に固定しているので、8個のキャラクタが並んで進んでいく。
レース・ゲーム制作 | |
2007 © Hiroshi Masuda |