りょうのゲーム塾 -119ページ目

りょうのゲーム塾

再開、準備中。

チェックポイント
プレイヤの移動を追加したプログラムです。
簡単な説明をブロック毎に記載します。
今回は内容が多いので間違いもあると思いますがそこは勘弁してくださいm(__)m


■プログラム
左右のキーでプレイヤが移動
0001 ' initialize
0002 UFO_X = 0:UFO_F = 0
0003 PLY_X = 15:PLY_F = 0
0004 ' game loop
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 ' task
0009 GOSUB @UFO
0010 GOSUB @PLAYER
0011 GOTO @LOOP
0012 ' UFO
0013 @UFO
0014 IF UFO_F!=0 GOTO @UFO_MVL
0015 ' move right
0016 LOCATE UFO_X, 0
0017 PRINT "A"
0018 UFO_X = UFO_X + 1
0019 IF UFO_X < 32 THEN RETURN
0020 UFO_X = 31
0021 UFO_F = 1
0022 RETURN
0023 ' move left
0024 @UFO_MVL
0025 LOCATE UFO_X, 0
0026 PRINT "A"
0027 UFO_X = UFO_X - 1
0028 IF UFO_X >= 0 THEN RETURN
0029 UFO_X = 0
0030 UFO_F = 0
0031 RETURN
0032 ' player
0033 @PLAYER
0034 IF PLY_F == 1 GOTO @PLY_MVR
0035 IF PLY_F == 2 GOTO @PLY_MVL
0036 ' stop
0037 LOCATE PLY_X,21
0038 PRINT "P"
0039 K = BUTTON()
0040 IF K AND 8 GOTO @PLY1
0041 IF K AND 4 GOTO @PLY2
0042 RETURN
0043 @PLY1
0044 PLY_F = 1
0045 RETURN
0046 @PLY2
0047 PLY_F = 2
0048 RETURN
0049 ' move right
0050 @PLY_MVR
0051 IF PLY_X < 30 THEN PLY_X = PLY_X + 1
0052 LOCATE PLY_X,21
0053 PRINT "P"
0054 IF BUTTON() AND 8 THEN RETURN
0055 PLY_F = 0
0056 RETURN
0057 ' move left
0058 @PLY_MVL
0059 IF PLY_X > 0 THEN PLY_X = PLY_X - 1
0060 LOCATE PLY_X,21
0061 PRINT "P"
0062 IF BUTTON() AND 4 THEN RETURN
0063 PLY_F = 0
0064 RETURN


■プログラム
初期化
0001 ' initialize
0002 UFO_X = 0:UFO_F = 0
0003 PLY_X = 15:PLY_F = 0

2行目:UFOの初期化
3行目:プレイヤの初期化
どちらとも初期位置の設定とフラグを0にしています
UFOのフラグは0が右移動で、1が左移動
プレイヤのフラグは0が停止、1が右移動、2が左移動です

■プログラム
ゲームループ
0004 ' game loop
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 ' task
0009 GOSUB @UFO
0010 GOSUB @PLAYER
0011 GOTO @LOOP

ゲームループではUFOとプレイヤを実行しています

■プログラム
UFOタスク
0012 ' UFO
0013 @UFO
0014 IF UFO_F!=0 GOTO @UFO_MVL
============================================
右に移動する
============================================
0015 ' move right
0016 LOCATE UFO_X, 0
0017 PRINT "A"
0018 UFO_X = UFO_X + 1
0019 IF UFO_X < 32 THEN RETURN
0020 UFO_X = 31
0021 UFO_F = 1
0022 RETURN
============================================
左に移動する
============================================
0023 ' move left
0024 @UFO_MVL
0025 LOCATE UFO_X, 0
0026 PRINT "A"
0027 UFO_X = UFO_X - 1
0028 IF UFO_X >= 0 THEN RETURN
0029 UFO_X = 0
0030 UFO_F = 0
0031 RETURN


UFOタスクではフラグにより0の場合右移動し、1の場合左移動を行います
どちらともにUFOを表示したあとUFOのx方向の座標を更新します。
右移動は+1、左移動は-1です。
座標を計算した後に画面の端に到達したか判定をしています。
右移動の場合にはUFO_Xが31で右端ですが31では右端に表示できるので実際には右端の座標31を超えたときに右端に到達したと判断しています。
要するに新しいX座標が32以下のとき右に移動したことになります。

逆にここでx座標が32のときは画面外なのでx座標を画面内に戻すためにUFO_Xに31を入れています。
そのあと左移動させるためにUFO_Fに1を設定しています。

左移動はその逆なので座標が0以下のとき画面外なので座標を0に戻し右移動させるためにフラグを0にしています。

■プログラム
プレイヤタスク
0032 ' player
0033 @PLAYER
0034 IF PLY_F == 1 GOTO @PLY_MVR
0035 IF PLY_F == 2 GOTO @PLY_MVL
============================================
プレイヤ停止
============================================
0036 ' stop
0037 LOCATE PLY_X,21
0038 PRINT "P"
0039 K = BUTTON()
0040 IF K AND 8 GOTO @PLY1
0041 IF K AND 4 GOTO @PLY2
0042 RETURN
0043 @PLY1
0044 PLY_F = 1
0045 RETURN
0046 @PLY2
0047 PLY_F = 2
0048 RETURN
============================================
プレイヤ右移動
============================================
0049 ' move right
0050 @PLY_MVR
0051 IF PLY_X < 30 THEN PLY_X = PLY_X + 1
0052 LOCATE PLY_X,21
0053 PRINT "P"
0054 IF BUTTON() AND 8 THEN RETURN
0055 PLY_F = 0
0056 RETURN
============================================
プレイヤ左移動
============================================
0057 ' move left
0058 @PLY_MVL
0059 IF PLY_X > 0 THEN PLY_X = PLY_X - 1
0060 LOCATE PLY_X,21
0061 PRINT "P"
0062 IF BUTTON() AND 4 THEN RETURN
0063 PLY_F = 0
0064 RETURN


プレイヤの場合はプレイヤの状態を停止、右移動、左移動に分けました。
0が停止、1が右移動、2が左移動です。
最初にフラグを判定して1の場合に右移動へジャンプします。
2のときは左移動へジャンプします。
そうでないときは停止ということになります。

ここで関数を使っています。

■書式
変数 = BUTTON()
DSiのキーの情報を取得します。


ここでは細かいことは抜きにして右キーと左キーを判断します。

IF BUTTON() AND 8 THEN 右キーが押されているときの処理

IF BUTTON() AND 4 THEN 左キーが押されているときの処理

プレイヤの3つの状態のプログラムはともにプレイヤを表示します。
停止は移動しないので座標の変更がありません。
右移動、左移動はUFOと同じですが少しプログラムの書き方を変えてみました。

この場合、移動する前に現在の座標を判断して、画面端にいなければ座標を更新します。
画面端の場合には何もしません。

実はこちらの方が少しプログラムがスッキリしていますね。
プログラムの書き方は一つでないためその場にあった書き方をすると分かりやすくなります。

移動の後の判定はやはりキーの判定です。
停止の場合は右キーと左キーの両方を判定しました。
右キーが押されている場合には右移動へ、左キーが押されていれば左移動へとフラグを変更しています。

右移動は右キーが押されている間右移動なので右だけ判定しています。
もし右キーが押されていなければ右移動をやめ停止状態になります。
左移動も同様です。
【注意】サブルーチンについての記事を先にお読みください!!

チェックポイント
今後、プログラムの解説を行う場合にプログラムがブロック化されている方が見やすくなるのでサブルーチン化することにします。
現行のサンプルプログラムおよびサブルーチン化したプログラムを記載します。


■プログラム
サブルーチンを使用していない場合
0001 ' initialize
0002 UFO_X = 0:UFO_F = 0
0003 PLY_X = 15
0004 ' game loop
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 ' UFO
0009 IF UFO_F!=0 GOTO @UFO_MVL
0010 ' move right
0011 LOCATE UFO_X, 0
0012 PRINT "A"
0013 UFO_X = UFO_X + 1
0014 IF UFO_X < 32 GOTO @UFO_END
0015 UFO_X = 31
0016 UFO_F = 1
0017 GOTO @UFO_END
0018 ' move left
0019 @UFO_MVL
0020 LOCATE UFO_X, 0
0021 PRINT "A"
0022 UFO_X = UFO_X - 1
0023 IF UFO_X >= 0 GOTO @UFO_END
0024 UFO_X = 0
0025 UFO_F = 0
0026 @UFO_END
0027 ' player
0028 LOCATE PLY_X,21
0029 PRINT "P"
0030 GOTO @LOOP


■プログラム
サブルーチンを使用した場合
0001 ' initialize
0002 UFO_X = 0:UFO_F = 0
0003 PLY_X = 15
0004 ' game loop
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 ' task
0009 GOSUB @UFO
0010 GOSUB @PLAYER
0011 GOTO @LOOP
0012 ' UFO
0013 @UFO
0014 IF UFO_F!=0 GOTO @UFO_MVL
0015 ' move right
0016 LOCATE UFO_X, 0
0017 PRINT "A"
0018 UFO_X = UFO_X + 1
0019 IF UFO_X < 32 THEN RETURN
0020 UFO_X = 31
0021 UFO_F = 1
0022 RETURN
0023 ' move left
0024 @UFO_MVL
0025 LOCATE UFO_X, 0
0026 PRINT "A"
0027 UFO_X = UFO_X - 1
0028 IF UFO_X >= 0 THEN RETURN
0029 UFO_X = 0
0030 UFO_F = 0
0031 RETURN
0032 ' player
0033 @PLAYER
0034 LOCATE PLY_X,21
0035 PRINT "P"
0036 RETURN


プログラムの解説する場合にはこのプログラムをブロック毎に説明した方が分かりやすくなります。今回のサンプルの場合は次のようになります。

■プログラム
プログラムの初期化
0001 ' initialize
0002 UFO_X = 0:UFO_F = 0
0003 PLY_X = 15


■プログラム
ゲームループ
0004 ' game loop
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 ' task
0009 GOSUB @UFO
0010 GOSUB @PLAYER
0011 GOTO @LOOP


■プログラム
UFOタスク
0012 ' UFO
0013 @UFO
0014 IF UFO_F!=0 GOTO @UFO_MVL
0015 ' move right
0016 LOCATE UFO_X, 0
0017 PRINT "A"
0018 UFO_X = UFO_X + 1
0019 IF UFO_X < 32 THEN RETURN
0020 UFO_X = 31
0021 UFO_F = 1
0022 RETURN
0023 ' move left
0024 @UFO_MVL
0025 LOCATE UFO_X, 0
0026 PRINT "A"
0027 UFO_X = UFO_X - 1
0028 IF UFO_X >= 0 THEN RETURN
0029 UFO_X = 0
0030 UFO_F = 0
0031 RETURN


■プログラム
プレイヤタスク
0032 ' player
0033 @PLAYER
0034 LOCATE PLY_X,21
0035 PRINT "P"
0036 RETURN

チェックポイント
今回は今後のプログラミング修正のためにプログラムをブロックに分けて話を進めていきます。
その際にプログラムを意味のあるブロックにわけて記述するときに便利な方法としてサブルーチンという考え方があります。


サブルーチンの使い方を説明するためのサンプルプログラムは下記の通りです。

■プログラム
変更前

0001 ' main
0002 INPUT "MOJI=";M$
0003 PRINT "MOJI=";M$
0004 END


このプログラムは今回のサブルーチンの説明のために作成したプログラムです。
BASICのプログラムがRUN命令によって実行される場合、プログラムの最初の行から実行されていきます。
このサンプルの場合入力命令で文字列を入力しその文字列を画面に表示して終了します。
これをメインルーチンと呼びます。
このメインルーチンに対してサブルーチンと呼ばれるものが存在します。

■プログラム
変更後

0001 ' main
0002 GOSUB @IN
0003 GOSUB @OUT
0004 END
0005 ' sub1
0006 @IN
0007 INPUT "MOJI=";M$
0008 RETURN
0009 ' sub2
0010 @OUT
0011 PRINT "MOJI=";M$
0012 RETURN


サンプルのプログラムはデータを入力する処理と出力する処理に分けることができるので2つのブロック(サブルーチン)に分けて記述してみました。
こうするとメインルーチンは入力部分”@IN”と出力部分”@OUT"で構成されていることが大まかに分かります。
サブルーチンは実際に入力する場合の処理と出力する場合の処理を分けて記述できるのでプログラムが見やすくなったと思います。
このプログラムは簡単なのであまり利点を分かっていただけないと思いますが、今後プログラムが長くなるのでブロック毎に説明をすることになるためこの方法が妥当だと思います。
GOSUB命令はサブルーチンへジャンプします。
GOTO命令と同じだと思われますがGOTO命令はジャンプしたらしたままです。
GOSUB命令はジャンプした後にRETUEN命令を使いもとに戻ります。

2行目のGOSUB命令で@INへジャンプします。
プログラムは@INへ進みINPUT命令が実行されます。
そしてRETURN命令を実行すると呼び出したGOSUB命令の次へ戻ります。
要するに3行目に戻り次のGOSUB命令を実行します。
今度は@OUTへジャンプします。
PRINT命令で文字列が画面に表示されたらRETURN命令を実行します。
このRETURN命令で呼びたした3行目のGOSUB命令の次に戻り4行目のEND命令でプログラムが終了します。

■書式
GOSUB @ラベル
@ラベルの位置へジャンプしますが戻る位置を記憶しておきます。


■書式
RETURN
GOSUB命令で記憶された場所にジャンプします。


■書式
REM または '
注釈(説明文)を記述することができます。
この注釈は何もしません。