前回覚えたGotoは行ったきり帰ってこない命令でした。

「千と千尋の神隠し」でゆばあばの姉のところに行くとき、片道切符だった。
そんな感じの命令です。

でも、好きなところを実行した後、また戻りたいということがあります。

デスノートで主人公の月がいったんデスノートを手放し、自分のところに戻すように。

そんな命令はGOSUBです。

GOSUB @ラベル

@ラベル名に飛ぶところはGotoと同じですが、
行った先でRETURNがあると、GOSUB @ラベルの次の行に処理が戻ります。

ある決まったことをやらせるのに便利です。

では、以前作ったボタンで移動するプログラムを改良してみましょう。

ボタンの入力を受け付けるには? BUTTON VSYNC

改良は、残像が出ないようにします。

---------------------------------------------------------------------
ACLS '画面をクリアする

AX=0 'X座標の位置
AY=0 'Y座標の位置
AZ=0 'Z座標の位置
BX=0 'X座標の位置前回分
BY=0 'Y座標の位置前回分
BZ=0 'Z座標の位置前回分
A=0  'ボタン変数

WHILE A != 32  'Bボタンが押されるまで繰り返す
  A = BUTTON() 'ボタンの入力状態の取得 ()内を指定しないときは0と同じ
  IF (A AND 1) == 1 THEN '上ボタンが押されたら
    AY = AY - 1        'AYから1を引く("大"の位置をひとつ上にする)
  ENDIF
  IF (A AND 2) == 2 THEN '下ボタンが押されたら
    AY = AY + 1        'AYから1を足す("大"の位置をひとつ下にする)
  ENDIF
  IF (A AND 4) == 4 THEN '左ボタンが押されたら
    AX = AX - 1        'AXから1を引く("大"の位置をひとつ左にする)
  ENDIF
  IF (A AND 8) == 8 THEN '右ボタンが押されたら
    AX = AX + 1        'AXから1を足す("大"の位置をひとつ右にする)
  ENDIF
  IF (A AND 256) == 256 THEN 'Lボタンが押されたら
    AZ = AZ - 1        'AZから1を引く("大"の位置をひとつ奥にする)
  ENDIF
  IF (A AND 512) == 512 THEN 'Rボタンが押されたら
    AZ = AZ + 1        'AZから1を足す("大"の位置をひとつ手前にする)
  ENDIF

  IF AX < 0 THEN 'AXが0より小さくなったら
    AX = 0     ' AXに0を入れる(画面からはみださないように)
  ENDIF
  IF AX > 49 THEN 'AXが49より大きくなったら
    AX = 49     ' AXに49を入れる(画面からはみださないように)
  ENDIF
  IF AY < 0 THEN 'AYが0より小さくなったら
    AY = 0     ' AYに0を入れる(画面からはみださないように)
  ENDIF
  IF AY > 28 THEN 'AYが28より大きくなったら
    AY = 28     ' AYに28を入れる(画面からはみださないように)
  ENDIF
  IF AZ < -256 THEN 'AZが-256より小さくなったら
    AZ = -256     ' AZに-256を入れる(画面からはみださないように)
  ENDIF
  IF AZ > 1024 THEN 'AZが1024より大きくなったら
    AZ = 1024     ' AZに1024を入れる(画面からはみださないように)
  ENDIF

'  LOCATE AX, AY, AZ  '位置の指定
'  PRINT "大"        'キャラクタ"大"の表示
  GOSUB @HYOJI
  VSYNC         '画面同期
WEND            '繰り返しここまで

LOCATE 0,0,0       '画面位置の初期化
END             ' 新しく追加

' 表示用サブルーチン
@HYOJI
' もし、AXとAY もしくはBXとBYが異なるなら(同じ位置でないなら)
IF AX != BX OR AY != BY THEN
  ' 前回の表示位置に設定
  LOCATE BX, BY, BZ
  ' 空を表示(これで前回の位置の大を消すことができる
  PRINT " "
' 判定終わり
ENDIF

' 今回の位置に設定
LOCATE AX, AY, AZ
' 大を表示
PRINT "大"

' 前回の位置変数に今回の位置を設定
BX = AX
BY = AY
BZ = AZ
' GOSUB用戻り命令
RETURN

------------------------------------------------------------------------
前回と異なるのは、前の場所を覚えておいてその場所に" "を表示させます。
そうすることで、大を消して、次の位置に大を表示します。

GOSUBを使用することでメインのプログラムが見やすくなります。
2015010301
2015010302
2015010303

実行するとこんな感じです。

2015010304