HSP3 ゲームのプログラミング | |
レース・ゲーム制作 |
(4) トラック・コース
○ コース概要
図のような、陸上競技のトラックのようなコースにすることを考える。Y座標340〜480は、着順などの情報を表示する領域に使用する予定である。
・図のAがスタートとゴールとして、反時計方向に移動する。
・キャラクタは8台、コースを守って移動する。
・1着を予想するゲームとする。
一番の問題は、このコース上をどのように移動させるかである。
○ コース描画
コース全体の領域(0, 0)〜(640,340)を塗りつぶしの四角形で描画する。色は緑(0, 255, 100)である。
次に、トラックの外側を描画する。図のように2つの円と四角形で描画する。色は濃い緑(0, 128, 50)である。
最後に、トラックの内側を描画する。外側と同じように2つの円と四角形で描画する。色は緑(0, 255, 100)である。
トラック外側 トラック内側
race11.hsp
コースを描画する。
ゲームの処理は、@画面消去、Aコース(背景)描画、Bキャラクタ移動・描画を繰り返すことになるので、コース描画の処理をサブルーチンとして作成することにする。
;race11.hsp screen 0, 640, 480 gosub *disp_course ;コース描画 stop ;------------------------------ ; コース描画 ----- *disp_course color 0,255,100 boxf 0, 0, 640, 340 ;領域全体 color 0,128,50 circle 0,0,340,340 ;外側の左側の円 circle 300,0,640,340 ;外側の右側の円 boxf 170,0,470,340 ;外側の四角形 color 0,255,100 circle 100,100,240,240 ;内側の左側の円 circle 400,100,540,240 ;内側の右側の円 boxf 170,100,470,240 ;内側の四角形 return
コースが描画される。
(5) マス目とコース座標
キャラクタのサイズは10ドットの正方形に収まるものとする。
キャラクタは、図右のマス目を移動させるイメージで考える。キャラクタは8台を予定しているので、キャラクタそれぞれのマス目は配列car_xとcar_yで管理する。
car_max = 8
dim car_x, car_max
dim car_y, car_max
第1コースのキャラクタはcar_x(0) = 0, car_y(0) = 0、をスタートしてcar_x(0) = 131でゴールである。car_y(0)はコースを守って移動するので変化しない。
図右のマス目座標はコースの座標から決定した。
スタートからの直線(@の部分)はコースの座標から300ドット(ピクセル)で、移動量を10ドットとしてマス目を30(=300/10)とした。
次の曲線(Aの部分)は、内側と外側で距離(ドット数)が違うので、移動量として角度で設定する。ここでは、移動量を5度としたのでマス目は36(=180度/5度)となる。
Bの部分とCの部分は、それぞれ@の部分とAの部分と同じである。
マス目とコースの対応が決まったところで、実際にマス目をコースの座標に変換する式を考える。
@の部分 (マス目 0〜29)
マス目(n) X座標 0 470 1 460 2 450 … … 28 190 29 180
マス目に対するX座標は表の通りである。マス目をnとして、Xをnの式で表すと次のようになる。
X = 470 - n * 10
コース番号(n) Y座標 1 90 2 80 3 70 … … 7 30 8 20 コース番号に対するY座標は表の通りである。コース番号をnとして、Yをnの式で表すと次のようになる。
Y = 100 - n * 10
Bの部分(マス目 66〜95)
マス目(n) X座標 66 170 67 180 68 190 … … 94 450 95 460
マス目に対するX座標は表の通りである。マス目をnとして、Xをnの式で表すと次のようになる。
X = 170 + (n - 66) * 10
コース番号(n) Y座標 1 250 2 260 3 270 … … 7 310 8 320 コース番号に対するY座標は表の通りである。コース番号をnとして、Yをnの式で表すと次のようになる。
Y = 240 + n * 10
(6) マス目とコース座標(曲線部分)
Aの曲線部分は、コースごとに半径が違い、角度90度から270度までの部分である。
角度と半径からコース上の座標を計算するには、三角関数を使って下図のように求める。
図では角度を60分法で示してあるが、多くのプログラム言語では角度をラジアンで扱っている。
ラジアンは、360度を2πで表す。2πとは半径1の円の円周である。
2π(ラジアン) = 360(度) 1(度) = π/180(ラジアン) |
Aの部分(角度 90〜270)
マス目(n) 角度 30 90 31 95 32 100 … … 64 265 65 270 マス目に対する角度は表の通りである。マス目をnとして、角度kをnの式で表すと次のようになる。
k = 90.0 + (n - 30) * 5.0
角度kをラジアンradに変換する式は次の通りである。π=3.1415とする。
rad = k * 3.1415 / 180.0
コース番号(n) 半径(r) 1 80 2 90 3 100 … … 7 140 8 150 コース番号に対する半径は表の通りである。コース番号をnとして、半径rをnの式で表すと次のようになる。
r = 70.0 + n * 10.0角度(ラジアン)と半径から座標x, yを計算する式は次の通りである。このときの円の中心座標は(170, 170)である。
x = 170.0 + r * cos(rad)
y = 170.0 - r * sin(rad)
Cの部分(角度 270〜450(90))
マス目(n) 角度 96 270 96 265 98 260 … … 130 445(85) 131 450(90) マス目に対する角度は表の通りである。マス目をnとして、角度kをnの式で表すと次のようになる。
k = 270.0 + (n - 96) * 5.0
角度kをラジアンradに変換する式は次の通りである。π=3.1415とする。
rad = k * 3.1415 / 180.0
コース番号(n) 半径(r) 1 80 2 90 3 100 … … 7 140 8 150 コース番号に対する半径は表の通りである。コース番号をnとして、半径rをnの式で表すと次のようになる。
r = 70.0 + n * 10.0角度(ラジアン)と半径から座標x, yを計算する式は次の通りである。このときの円の中心座標は(470, 170)である。
x = 470.0 + r * cos(rad)
y = 170.0 - r * sin(rad)
race12.hsp
マス目をコース座標に変換する処理をサブルーチンとして作成する。マス目データを変数xとyに格納して、サブルーチンを呼び出すと同じ変数xとyにコース座標が格納されるようにする。
;race12.hsp screen 0, 640, 480 car_max = 8 ;台数 dim car_x, car_max ;x座標 dim car_y, car_max ;y座標 foreach car_y car_y(cnt) = cnt + 1 ;コース番号1-8 loop repeat redraw 0 gosub *disp_course ;コース描画 foreach car_x ;台数分 x = car_x(cnt) : y = car_y(cnt) gosub *xy_henkan ;座標変換 hsvcolor cnt * 20, 255, 255 boxf x, y, x + 8, y + 8 ;キャラクタ描画 car_x(cnt) += 1 ;移動量 if car_x(cnt) > 131 : car_x(cnt) = 0 loop redraw 1 await 200 loop stop ;------------------------------- ;座標変換 ----- *xy_henkan if x < 30 { ;@の部分 x = 470 - x * 10 y = 100 - y * 10 return } if x < 66 { ;Aの部分 r = 70.0 + y * 10.0 k = 90.0 + (x - 30) * 5.0 rad = k * 3.1415 / 180.0 x = 170.0 + r * cos(rad) y = 170.0 - r * sin(rad) return } if x < 96 { ;Bの部分 x = 170 + (x - 66) * 10 y = 240 + y * 10 return } if x < 132 { ;Cの部分 r = 70.0 + y * 10.0 k = 270.0 + (x - 96) * 5.0 rad = k * 3.1415 / 180.0 x = 470.0 + r * cos(rad) y = 170.0 - r * sin(rad) return } ; コース描画 ----- *disp_course << 省 略 >> return
コース上を8台のキャラクタが並んで移動する。
レース・ゲーム制作 | |
2007 © Hiroshi Masuda |