HSP3 ゲームのプログラミング (プログラミング例) | |
リンクをクリックするとリストが表示される。
試してみよう
移動量dxを10に増やす。 → 移動スピードが速くなる。
x = 0 : y = 100 ;初期座標設定(開始位置) dx = 10 : dy = 0 ;移動量の設定 repeat color 255, 255, 255 ;※1 白色。背景と同じ色。 boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;※2 黒色 pos x, y ;※2 カレントポジションを座標(x, y)に設定する。 mes "○" ;※2 ○を表示する。 x = x + dx ;※3 x座標加算 y = y + dy ;※3 y座標加算 if x > ginfo_winx : break ;※4 無限ループ終了 await 100 ;無限ループの時のお約束 loop stop
試してみよう
移動量dyを10に増やす。 → 斜め右下方向に移動する。
x = 0 : y = 100 ;初期座標設定(開始位置) dx = 10 : dy = 10 ;移動量の設定 repeat color 255, 255, 255 ;※1 白色。背景と同じ色。 boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;※2 黒色 pos x, y ;※2 カレントポジションを座標(x, y)に設定する。 mes "○" ;※2 ○を表示する。 x = x + dx ;※3 x座標加算 y = y + dy ;※3 y座標加算 if x > ginfo_winx : break ;※4 無限ループ終了 await 100 ;無限ループの時のお約束 loop stop
試してみよう
await命令の値を200に増やす。 → 移動スピードが遅くなる。
x = 0 : y = 100 ;初期座標設定(開始位置) dx = 10 : dy = 10 ;移動量の設定 repeat color 255, 255, 255 ;※1 白色。背景と同じ色。 boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;※2 黒色 pos x, y ;※2 カレントポジションを座標(x, y)に設定する。 mes "○" ;※2 ○を表示する。 x = x + dx ;※3 x座標加算 y = y + dy ;※3 y座標加算 if x > ginfo_winx : break ;※4 無限ループ終了 await 200 ;無限ループの時のお約束 loop stop
課題(move91.hsp)
文字「○」を斜めに移動させる。上下左右の壁ではね返るようにする。
;move91.hsp ;文字「○」を斜めに移動させる。 x = 100 : y = 100 ;初期座標設定(開始位置) dx = 8 : dy = 8 ;移動量の設定 repeat color 255, 255, 255 ;白色。背景と同じ色。 boxf ;ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;黒色 pos x, y ;カレントポジションを座標(x, y)に設定する。 mes "○" x = x + dx ;x座標加算 y = y + dy ;y座標加算 if x > ginfo_winx - 16 : dx = -dx ;右壁に衝突。 if x <= 0 : dx = -dx ;左壁に衝突。 if y > ginfo_winy - 16 : dy = -dy ;下壁に衝突。 if y <= 0 : dy = -dy ;上壁に衝突。 await 100 ;無限ループの時のお約束 loop stop
課題(move92.hsp)
左右反転した画像を追加して、右方向へ移動するときと左方向へ移動するときとで画像を切り替える。
;move92.hsp ; 画像をウィンドウ内で移動させる。画像を切り替える。 buffer 1 ;ウィンドウID 1番 picload "move2.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 x = 100 : y = 100 dx = 8 : dy = 8 gf = 0 ;画像切り替え用 gf2 = 0 ;画像方向切り替え用 repeat color 255, 255, 255 ;白色。背景と同じ色。 boxf ;ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;黒色 pos x, y ;カレントポジション設定 if gf2 = 0 { ;右方向へ移動 if gf = 0 { gcopy 1, 0, 0 ;上段左画像コピー gf = 1 } else { gcopy 1, 32, 0 ;上段右画像コピー gf = 0 } } else { ;左方向へ移動 if gf = 0 { gcopy 1, 0, 32 ;下段左画像コピー gf = 1 } else { gcopy 1, 32, 32 ;下段右画像コピー gf = 0 } } x = x + dx ;x座標加算 y = y + dy ;y座標加算 if x > ginfo_winx - 32 : dx = -dx : gf2 = 1 ;右壁に衝突。 if x <= 0 : dx = -dx : gf2 = 0 ;左壁に衝突。 if y > ginfo_winy - 32 : dy = -dy ;下壁に衝突。 if y <= 0 : dy = -dy ;上壁に衝突。 await 100 ;無限ループの時のお約束 loop stop
課題(move93.hsp)
キャラクタごとに移動量を変化させよ。移動量は-10 〜 10の範囲とする。
;move93.hsp ; 複数の画像をウィンドウ内で移動させる。画像を切り替える。 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 ;コピーモード設定 foreach x x(cnt) = rnd(80 - 8) * 8 : y(cnt) = rnd(60 - 8) * 8 dx(cnt) = rnd(21) - 10 : dy(cnt) = rnd(21) - 10 gf(cnt) = 0 ;画像切り替え用 loop 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 redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop stop
課題(move94.hsp)
左右反転した画像を追加して、右方向へ移動するときと左方向へ移動するときとで画像を切り替える処理を追加せよ。
;move94.hsp ; 複数の画像をウィンドウ内で移動させる。画像を切り替える。 kosu = 10 dim x, kosu : dim y, kosu : dim gf, kosu dim dx, kosu : dim dy, kosu : dim gf2, kosu buffer 1 ;ウィンドウID 1番 picload "move2.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 foreach x x(cnt) = rnd(80 - 8) * 8 : y(cnt) = rnd(60 - 8) * 8 dx(cnt) = rnd(21) - 10 : dy(cnt) = rnd(21) - 10 gf(cnt) = 0 ;画像切り替え用 if dx(cnt) < 0 : gf2(cnt) = 1 : else : gf2(cnt) = 0 ;画像方向切り替え用 loop repeat redraw 0 ;仮描画 color 255, 255, 255 ;白色。背景と同じ色。 boxf ;ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;黒色 foreach x pos x(cnt), y(cnt) ;カレントポジション設定 if gf2(cnt) = 0 { ;右方向へ移動 if gf(cnt) = 0 { gcopy 1, 0, 0 ;上段左画像コピー gf(cnt) = 1 } else { gcopy 1, 32, 0 ;上段右画像コピー gf(cnt) = 0 } } else { ;左方向へ移動 if gf(cnt) = 0 { gcopy 1, 0, 32 ;下段左画像コピー gf(cnt) = 1 } else { gcopy 1, 32, 32 ;下段右画像コピー 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) : gf2(cnt) = 1 ;右壁に衝突。 if x(cnt) <= 0 : dx(cnt) = -dx(cnt) : gf2(cnt) = 0 ;左壁に衝突。 if y(cnt) >= ginfo_winy - 32 : dy(cnt) = -dy(cnt) ;下壁に衝突。 if y(cnt) <= 0 : dy(cnt) = -dy(cnt) ;上壁に衝突。 loop redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop stop
課題(move95.hsp)
上下左右のカーソルキーでキャラクタを移動させる。2種類の画像を切り替える。
;move95.hsp ; 上下左右のカーソルキーでキャラクタを移動させる。 buffer 1 ;ウィンドウID 1番 picload "move2.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 x = 100 : y = 100 dx = 8 : dy = 8 gf = 0 ;画像切り替え用 repeat redraw 0 ;仮描画 color 255, 255, 255 ;白色。背景と同じ色。 boxf ;ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;黒色 pos x, y ;カレントポジション設定 if gf = 0 { gcopy 1, 0, 0 ;画像コピー gf = 1 } else { gcopy 1, 32, 0 ;画像コピー gf = 0 } stick key, 15 ;キー入力 if key & 1 : x = x - dx ;左 if key & 2 : y = y - dy ;上 if key & 4 : x = x + dx ;右 if key & 8 : y = y + dy ;下 if key & 128 : end ;[Esc] if x >= ginfo_winx - 32 : x = ginfo_winx - 32 ;右壁に衝突。 if x <= 0 : x = 0 ;左壁に衝突。 if y >= ginfo_winy - 32 : y = ginfo_winy - 32 ;下壁に衝突。 if y <= 0 : y = 0 ;上壁に衝突。 redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop stop
課題(move96.hsp)
キャラクタを移動させ、上壁に当衝突したら下壁から、左壁に当衝突したら右壁から出てくるようにする。
;move96.hsp ; 上下左右のカーソルキーでキャラクタを移動させる。 buffer 1 ;ウィンドウID 1番 picload "move2.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 x = 100 : y = 100 dx = 8 : dy = 8 gf = 0 ;画像切り替え用 repeat redraw 0 ;仮描画 color 255, 255, 255 ;白色。背景と同じ色。 boxf ;ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;黒色 pos x, y ;カレントポジション設定 if gf = 0 { gcopy 1, 0, 0 ;画像コピー gf = 1 } else { gcopy 1, 32, 0 ;画像コピー gf = 0 } stick key, 15 ;キー入力 if key & 1 : x = x - dx ;左 if key & 2 : y = y - dy ;上 if key & 4 : x = x + dx ;右 if key & 8 : y = y + dy ;下 if key & 128 : end ;[Esc] if x >= ginfo_winx - 31 : x = 0 ;右壁に衝突。 if x <= -1 : x = ginfo_winx - 32 ;左壁に衝突。 if y >= ginfo_winy - 31 : y = 0 ;下壁に衝突。 if y <= -1 : y = ginfo_winy - 32 ;上壁に衝突。 redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop stop
課題(move97.hsp)
下壁に当たったら、はね返らずにメッセージ(ダイアログ)を表示して、再開または終了できるようにする。
;move97.hsp buffer 1 ;ウィンドウID 1番 picload "move3.bmp" ;画像ファイル読み込み screen 0 ;ウィンドウID 0番 gmode 2, 32, 32 ;コピーモード設定 mm = 8 ;間隔 *start x0 = 12 : y0 = 12 ;キャラクタの座標 dx0 = 1 : dy0 = 1 ;キャラクタの移動量 x1 = 12 : y1 = 55 ;バーの座標 dx1 = 2 : dy1 = 0 ;バーの移動量 repeat redraw 0 ;仮描画 color 255, 255, 255 ;白色。背景と同じ色。 boxf ;ウィンドウと同じサイズの四角形を塗りつぶしで描画する。 color 0, 0, 0 ;黒色 pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 64, 0, 32, 8 ;画像コピー if abs(x0 - x1) <= 2 & y0 + 3 = y1 : dy0 = -dy0 ;衝突判定 x0 = x0 + dx0 ;x座標加算 y0 = y0 + dy0 ;y座標加算 if x0 >= (ginfo_winx - 32) / mm : dx0 = -dx0 ;右壁に衝突。 if x0 <= 0 : dx0 = -dx0 ;左壁に衝突。 if y0 >= (ginfo_winy - 32) / mm : break ;下壁に衝突。 if y0 <= 0 : dy0 = -dy0 ;上壁に衝突。 stick key, 15 ;キー入力 if key & 1 : x1 = x1 - dx1 ;左 if key & 4 : x1 = x1 + dx1 ;右 if key & 128 : end ;[Esc] x1 = limit(x1, 0, (ginfo_winx - 32) / mm) redraw 1 ;実描画 await 100 ;無限ループの時のお約束 loop dialog "もう一度しますか。", 2 if stat = 6 : goto *start end
2007 © Hiroshi Masuda |