HSP3 ゲームのプログラミング | |
(3) 複数キャラクタの移動
キャラクタの移動には、そのキャラクタの座標や移動量を格納しておく変数を用意し、座標を変化させることで移動させた。キャラクタが複数になった場合は、それぞれのキャラクタについて座標や移動量を格納する変数を用意することになるが、同じ種類の変数を複数用意する必要があるので、配列変数にすると便利である。
(move31.hsp)
一つのキャラクタ移動のプログラム(move13.hsp)を元に、複数のキャラクタ移動のプログラムを作成する。
move31 | move13 |
kosu = 10 dim x, kosu : dim y, kosu : dim gf, kosu dim dx, kosu : dim dy, kosu |
|
buffer 1
;ウィンドウID 1番 picload "move1.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 |
buffer 1
;ウィンドウID 1番 picload "move1.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 |
foreach x x(cnt) = rnd(640 - 64) : y(cnt) = rnd(480 - 64) dx(cnt) = 8 : dy(cnt) = 8 gf(cnt) = 0 ;画像切り替え用 loop |
x = 100 : y = 100 dx = 8 : dy = 8 gf = 0 ;画像切り替え用 |
repeat redraw 0 ;仮描画 color 255, 255, 255 ;白色。背景と同色。 boxf ;四角形を塗りつぶしで描画 color 0, 0, 0 ;黒色 |
repeat redraw 0 ;仮描画 color 255, 255, 255 ;白色。背景と同色。 boxf ;四角形を塗りつぶしで描画 color 0, 0, 0 ;黒色 |
foreach x pos x(cnt), y(cnt) ;カレントポジション設定 if gf(cnt) = 0 { gcopy 1, 0, 0 ;画像コピー gf(cnt) = 1 } else { gcopy 1, 32, 0 ;画像コピー gf(cnt) = 0 } x(cnt) = x(cnt) + dx(cnt) ;x座標加算 y(cnt) = y(cnt) + dy(cnt) ;y座標加算 if x(cnt) > ginfo_winx - 32 : dx(cnt) = -dx(cnt) ;右壁 if x(cnt) <= 0 : dx(cnt) = -dx(cnt) ;左壁に衝突。 if y(cnt) > ginfo_winy - 32 : dy(cnt) = -dy(cnt) ;下壁 if y(cnt) <= 0 : dy(cnt) = -dy(cnt) ;上壁に衝突。 loop |
pos x, y ;カレントポジション設定 if gf = 0 { gcopy 1, 0, 0 ;画像コピー gf = 1 } else { gcopy 1, 32, 0 ;画像コピー gf = 0 } x = x + dx ;x座標加算 y = y + dy ;y座標加算 if x > ginfo_winx - 32 : dx = -dx ;右壁 if x <= 0 : dx = -dx ;左壁に衝突。 if y > ginfo_winy - 32 : dy = -dy ;下壁 if y <= 0 : dy = -dy ;上壁に衝突。 |
redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop stop |
redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop stop |
move21を実行すると10個のキャラクタが移動する。
初期座標の設定をx(cnt)=100:y(xnt)=100とするとすべてのキャラクタが同じ座標から移動を開始するので、結局一つしか移動していないように見える。それぞれの初期座標を変えるため、乱数で初期座標を設定している。x方向はウィンドウサイズ640、y方向はウィンドウサイズ480の範囲内に描画されるように乱数を発生させる。
キャラクタをよく見ていると壁に少し埋まるものがある。これは移動量(dx,dy)を8としているので、初期座標に8を加算していくと壁衝突の座標を超えるためである。これを防ぐためには、初期座標が8の倍数になるようにする。
x(cnt) = rnd(80 - 8) * 8 : y(cnt) = rnd(60 - 8) * 8
右と下壁の判定も">"を">="に変更する。
if x(cnt) >= ginfo_winx - 32 : dx(cnt) = -dx(cnt) ;右壁
if y(cnt) >= ginfo_winy - 32 : dy(cnt) = -dy(cnt) ;下壁
(move93.hsp)
キャラクタごとに移動量を変化させよ。移動量は-10 〜 10の範囲とする。
(move94.hsp)
左右反転した画像を(move2.bmp)使って、右方向へ移動するときと左方向へ移動するときとで画像を切り替える処理を追加せよ。
2007 © Hiroshi Masuda |