【はじめてのプチコン】移動の終了判定 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
前回はUFOの移動を行うプログラムを作成しました。
しかしUFOは画面左上から右上に移動するだけでそれ以降は移動しません。
今回は移動の終了を判定する部分を追加してみたいと思います。


前回のサンプルプログラムは下記の通りです。

■プログラム
0001 X = 0
0002 @LOOP
0003 VSYNC 1
0004 CLS
0005 LOCATE X, 0
0006 PRINT "A"
0007 X = X + 1
0008 GOTO @LOOP


このプログラムを実行するとUFOが画面左上から右上に移動しなぜか左上で止まったままになります。
これは LOCATE文のX方向の指定で使える値が0から31の間なのですがUFOが右上に移動した後も右に行こうとしているからX方向の値が不適切な値になっているためです。

プログラムではこの様なことが起きないようにしなければなりません。
次のプログラムは右上に到達した場合プログラムを終了します。

■プログラム
0001 X = 0
0002 @LOOP
0003 VSYNC 1
0004 CLS
0005 LOCATE X, 0
0006 PRINT "A"
0007 X = X + 1
0008 IF X < 32 GOTO @LOOP
0009 END

■実行画面

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                               仝┃
┃OK                              ┃
┃_                               ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┃                                ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛


しかしこのままではすぐにプログラムは終了してしまうのでゲームにはなりません。
そこでこのUFOを画面上で左右に移動するように変更してみましょう。

■プログラム
0001 X = 0
0002 @LOOP1
0003 VSYNC 1
0004 CLS
0005 LOCATE X, 0
0006 PRINT "A"
0007 X = X + 1
0008 IF X < 32 GOTO @LOOP1
0009 X = 31
0010 @LOOP2
0011 VSYNC 1
0012 CLS
0013 LOCATE X, 0
0014 PRINT "A"
0015 X = X - 1
0016 IF X >= 0 GOTO @LOOP2
0017 X = 0
0018 GOTO @LOOP1


これでUFOは左右に移動するようになりました。
言い忘れたわけではないのですが新しい命令が使われています。

■書式
IF 条件式 GOTO @ラベル
条件式が成り立つときラベルのあるプログラム位置へジャンプする


この命令は IF 条件式 THEN GOTO @ラベルと同じです。

チェックポイント
ゲームのプログラムはキャラクタが移動したりする場合この様に処理を繰り返し行わなければなりません。
このような繰り返しはループと呼ばれていますが、特にゲームの1回のループの間にゲーム中で表示されているキャラクタすべてを実行しなければなりません。
このようなループをゲームループと呼んでいます。


このプログラムには問題があります。
ゲームループはゲーム中にひとつだけでないと不都合なのです。
このサンプルの場合ループが2つありますよね。
しかしこの説明もゲームの中での時間の概念を説明しなければならないのである程度理解ができたで頃に説明することにします。
ここでは『何故?』ではなくそうしなければならない理由があるということで勘弁してください。

それではこのループを一つにしてみましょう。

■プログラム
0001 ' initialize
0002 UFO_X = 0
0003 UFO_F = 0
0004 ' game loop
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 ' UFO
0009 IF UFO_F!=0 GOTO @UFO1
0010 ' move right
0011 LOCATE UFO_X, 0
0012 PRINT "A"
0013 UFO_X = UFO_X + 1
0014 IF UFO_X < 32 GOTO @LOOP
0015 UFO_X = 31
0016 UFO_F = 1
0017 ' move left
0018 @UFO1
0019 LOCATE UFO_X, 0
0020 PRINT "A"
0021 UFO_X = UFO_X - 1
0022 IF UFO_X >= 0 GOTO @LOOP
0023 UFO_X = 0
0024 UFO_F = 0
0025 GOTO @LOOP


今回は思い切ってプログラムを変更しました。
変更点は以下の通りです。
1)移動のために使っていた変数Xを今後のために変数UFO_Xに変更した。
2)ゲームループの中にUFOの移動プログラムがあるが右へ移動と左へ移動するプログラムを判断するためのフラグ変数UFO_Fを作った。
3)ゲームループを一つにした
4)プログラムに注釈を加えた。

UFOの移動は変数UFO_Fの値が0の時右へ移動、0でない時に左へ移動します。
右へ移動するプログラムも左に移動するプログラムもUFOの一つの動作を表しています。
そしてこの動作は同時には起きません。
この様に同じキャラクタのプログラムでありながら同時に実行されることがなくそれらが集まることでUFOが多彩な動きをすることができるこのようなプログラムをタスクと呼んでいます。

要するにUFOにとって0011行から0016行までが右移動のタスク、0018行から0025行までが左移動のタスクになります。