【はじめてのプチコン】プレイヤの移動 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
プレイヤの移動を追加したプログラムです。
簡単な説明をブロック毎に記載します。
今回は内容が多いので間違いもあると思いますがそこは勘弁してください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と同じですが少しプログラムの書き方を変えてみました。

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

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

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

右移動は右キーが押されている間右移動なので右だけ判定しています。
もし右キーが押されていなければ右移動をやめ停止状態になります。
左移動も同様です。