まずは中央にキャラクターを表示してみましょう。
CLS:X=15:Y=11 LOCATE X,Y:PRINT "◆";
これを拡張し、十字カーソルでキャラクターを動かすサンプルにします。
VSYNC命令でタイミングをとりながらループしています。 ループごとにBUTTON命令で十字キーの状態を確認し、キャラクターを動かします
REM *** Move a character (1) *** CLS:X=15:Y=11 @LOOP DX=0:DY=0:B=BUTTON() IF B AND 1 THEN DY=-1 IF B AND 2 THEN DY=1 IF B AND 4 THEN DX=-1 IF B AND 8 THEN DX=1 LOCATE X,Y:PRINT " "; X=X+DX:Y=Y+DY LOCATE X,Y:PRINT "◆"; VSYNC 1 GOTO @LOOP
このままだと画面を飛び出して表示が乱れてしまいますよね。 飛び出さないように、座標の範囲指定を加えたのが以下のサンプルです。
REM *** Move a character (2) *** CLS:X=15:Y=11 @LOOP DX=0:DY=0:B=BUTTON() IF B AND 1 THEN DY=-1 IF B AND 2 THEN DY=1 IF B AND 4 THEN DX=-1 IF B AND 8 THEN DX=1 LOCATE X,Y:PRINT " "; X=X+DX:Y=Y+DY IF X<0 THEN X=0 IF X>31 THEN X=31 IF Y<0 THEN Y=0 IF Y>23 THEN Y=23 LOCATE X,Y:PRINT "◆"; VSYNC 1 GOTO @LOOP
僕なら以下のように、座標の範囲指定とボタン押しを同時に実施しちゃいます。
REM *** Move a character (3) *** CLS:X=15:Y=11 @LOOP DX=0:DY=0:B=BUTTON() IF (Y>0)AND(B AND 1) THEN DY=-1 IF (Y<23)AND(B AND 2)>0 THEN DY=1 IF (X>0)AND(B AND 4)>0 THEN DX=-1 IF (X<31)AND(B AND 8)>0 THEN DX=1 LOCATE X,Y:PRINT " "; X=X+DX:Y=Y+DY LOCATE X,Y:PRINT "◆"; VSYNC 1 GOTO @LOOP
動かないときも消したり書いたりするのが無駄? であれば以下のようにスキップさせるのも良いでしょう。
REM *** Move a character (4) *** CLS:X=15:Y=11 @LOOP DX=0:DY=0:B=BUTTON() IF (Y>0)AND(B AND 1) THEN DY=-1 IF (Y<23)AND(B AND 2)>0 THEN DY=1 IF (X>0)AND(B AND 4)>0 THEN DX=-1 IF (X<31)AND(B AND 8)>0 THEN DX=1 IF DX==0 AND DY==0 THEN @LOOP_SKIP LOCATE X,Y:PRINT " "; X=X+DX:Y=Y+DY LOCATE X,Y:PRINT "◆"; @LOOP_SKIP VSYNC 1 GOTO @LOOP
今回は後に続く処理が無いので、以下のようにもできますね。
REM *** Move a character (5) *** CLS:X=15:Y=11 @LOOP VSYNC 1 DX=0:DY=0:B=BUTTON() IF (Y>0)AND(B AND 1) THEN DY=-1 IF (Y<23)AND(B AND 2)>0 THEN DY=1 IF (X>0)AND(B AND 4)>0 THEN DX=-1 IF (X<31)AND(B AND 8)>0 THEN DX=1 IF DX==0 AND DY==0 THEN @LOOP LOCATE X,Y:PRINT " "; X=X+DX:Y=Y+DY LOCATE X,Y:PRINT "◆"; GOTO @LOOP