シューティングゲームを作ろう その10 |
19.ESCキーで終了 |
;ESCキーで終了 if esckey == 1 { dsend diend end }
ESCキーが押されていたらプログラムを終了します。
「キー、ジョイパッドの入力」サブルーチンは、自機の移動処理の所で呼んでいます。そこからここに至るまでの時間は無視できるほどの短いものですので、新たに呼びなおす必要はありません。
20.画面の更新 |
20-1.背景の描画 |
ごく簡単な背景のスクロールをします。
; ;画面の更新 ; redraw 0 ;背景の描画 for i, 0, 9 for j, 0, 8 gdx = j * 64 : gdy = -64 + scroll_cnt \ 64 + i * 64 wid = 2 div_no = 0 gosub *Graphic_Draw next next
背景画像を縦横に並べてゲーム画面を埋めます。背景画像は64×64、ゲーム画面は480×480なので、480 / 64 = 7.5、つまり8行8列描けばゲーム画面を埋められます。スクロールを考慮しない場合、以下のようになります。
for i, 0, 8 for j, 0, 8 gdx = j * 64 : gdy = i * 64 wid = 2 div_no = 0 gosub *Graphic_Draw next next
なお、本サンプルの背景画像には完全な黒の部分がないので、これで前に描いた内容は消えます。
では、8ドットスクロールした(scroll_cntが8である)背景はどのように描けばよいでしょうか。今のを8ドット下にずらして描けばよいということになります。
gdy = scroll_cnt + i * 64
すると、上の方が空いてしまいます。そこで1行多く描きます。
for i, 0, 9 for j, 0, 8 gdx = j * 64 : gdy = -64 + scroll_cnt + i * 64 wid = 2 div_no = 0 gosub *Graphic_Draw next next
64ドットごとに同じ模様が並んでいるのですから、64ドットスクロールした画面は最初の画面(0ドットスクロールした画面)と同じです。128ドットスクロールした画面も0ドットスクロールした画面を描けばよく、72ドットスクロールした画面は8ドットスクロールした画面を描けばよく、138ドットスクロールした画面は10ドットスクロールした画面を描けばよい、ということになります。
つまり、scroll_cnt \ 64ドット下にずらして描けばよい、ということになります。
gdy = -64 + scroll_cnt \ 64 + i * 64
20-2.敵、自機の描画 |
;敵の描画 for i, 0, ENEMAX if enemy_state(i) == 1 { gdx = enemy_x(i) : gdy = enemy_y(i) wid = 1 div_no = 2 + enemy_kind(i) gosub *Graphic_Draw } if enemy_state(i) == 2 { gdx = enemy_x(i) - 16 : gdy = enemy_y(i) - 16 wid = 2 div_no = 1 gosub *Graphic_Draw } next
敵の状態が「通常」の場合にはそれぞれの種類に対応する絵を、「爆発中」の場合には敵の爆炎を描きます。
;自機の描画 if myship_state == 1 { gdx = myship_x : gdy = myship_y wid = 1 div_no = 0 gosub *Graphic_Draw } if myship_state == 2 { gdx = myship_x - 16 : gdy = myship_y - 16 wid = 2 div_no = 2 gosub *Graphic_Draw } if myship_state == 3 & myrevival_cnt \ 10 < 5 { gdx = myship_x : gdy = myship_y wid = 1 div_no = 0 gosub *Graphic_Draw }
自機の状態が「通常」の場合には自機の絵を、「爆発中」の場合には自機の爆炎を、「復活中」の場合には自機の絵を点滅させて描きます。
どうやって点滅させるかというと、myrevival_cnt \ 10が5より小さい時だけ描きます。すると0 〜 4の時表示、5 〜 9の時非表示、10 〜 14の時表示、15 〜 19の時非表示……となります。
なお、「通常」の場合と「復活中」の場合は、次のようにまとめて書くこともできます。
if myship_state == 1 | (myship_state == 3 & myrevival_cnt \ 10 < 5) { gdx = myship_x : gdy = myship_y wid = 1 div_no = 0 gosub *Graphic_Draw }
補足 |
・ESCキーで終了 |
本サンプルのようにフルスクリーンモードにしか対応していない(ウィンドウモードには切り替えられない)ゲームの場合、メイン・ループを作る際に、「ESCキーで終了」処理を真っ先に作った方がいいです。これがないと、ゲームを途中でやめたくなった場合、わざとゲームオーバーになるしかありません。逆に言えばゲームオーバー処理を作るまでは、プログラムを止める手段がありません。Ctrl + Alt + Deleteキーで強制終了するしかありません。 |
・背景画像に完全な黒の部分がある場合 |
背景画像に完全な黒の部分がある場合は、そこは透明として扱われるので、前に描いた内容が残ってしまいます。その場合は画面をクリア(gosub *Clear_Screen)してから背景を描いてください。 |