
参考資料
§ 基本アクション(スプライト移動) §
歩け、歩け!
ボタンの押し下げ状態
ボタンの押し下げ状態は、BUTTON関数で取得する事が出来ます。BUTTON関数の戻り値(関数の返す値)は、下記の通りです。
| ボタン | 対象ビット | 2進数値 | 10進数値 |
| 十字ボタン上 | bit0 | 0000000000000001 | 1 |
| 十字ボタン下 | bit1 | 0000000000000010 | 2 |
| 十字ボタン左 | bit2 | 0000000000000100 | 4 |
| 十字ボタン右 | bit3 | 0000000000001000 | 8 |
| Aボタン | bit4 | 0000000000010000 | 16 |
| Bボタン | bit5 | 0000000000100000 | 32 |
| Xボタン | bit6 | 0000000001000000 | 64 |
| Yボタン | bit7 | 0000000010000000 | 128 |
| Lボタン | bit8 | 0000000100000000 | 256 |
| Rボタン | bit9 | 0000001000000000 | 512 |
| ZRボタン | bit11 | 0000100000000000 | 2048 |
| ZLボタン | bit12 | 0001000000000000 | 4096 |
単独のボタンが押されて居るかを調べ度い時(例えば、十字ボタンの右が押されて居るかを調べ度い時)は、下記の様に記述します。
B=BUTTON(0)
IF B=8 THEN …
複数のボタンが押されて居るかを調べ度い時(例えば、Aボタンを押しながら十字ボタンの右が押されて居るかを調べ度い時)は、下記の様に記述します。
B=BUTTON(0)
IF B AND 8 THEN …
IF B AND 16 THEN …
此れは、Aボタンと十字ボタンの右が同時に押されて居る場合、BUTTON関数の戻り値は24と成るので、IF B=8 THEN も IF B=16 THEN も条件を満たさなく成るので。論理演算子ANDを使用して対象ビットが立って居るかを調べる必要が有るからです。
変数のインクリメントとデクリメント
変数に或る値を加えた値を元の変数に代入する事(インクリメントと謂う)や、変数に或る値を引いた値を元の変数に代入する事(デクリメントと謂う)は、プログラムでは頻繁に行われます。
例えば、変数Xに1を加えた値を変数Xに代入する時や、変数Yに1を引いた値を変数Yに代入する時は、下記の様に記述します(数学的に考えると有り得ない式です)。
X=X+1
Y=Y-1
Smile BASICでは、アセンブラ並みに、INC命令やDEC命令も使用する事が出来ます(但し、Visual BasicやVisual C#の様な X+=1 や Y-=1 は使用する事は出来ません)。
INC X,1
DEC Y,1
猶、加算や減算する値が 1 の場合は省略する事が出来ます(通常、省略します)。
アニメーション
スプライトを動きに合わせてアニメーションさせるには、SPANIMステートメントを使用するより、SPCHRステートメントで、其の都度スプライトの画像を変更します(動きが速過ぎない様にウェイトを入れる必要が有ります)。因みに、SPANIMステートメントは、常にアニメーションさせる場合に有効な手段です。
プログラムの説明
下記のプログラムでは、スプライトが、
ボタンで上下左右にアニメーションしながら動きます。
| 0000001 | OPTION STRICT |
| 0000002 | ACLS |
| 0000003 | BGFILL 0,0,0,24,14,105 |
| 0000004 | SPSET 0,600 |
| 0000005 | SPSCALE 0,2,2 |
| 0000006 | SPOFS 0,184,104 |
| 0000007 | DIM B,X=184,Y=104,C=0,N=0 |
| 0000008 | |
| 0000009 | LOCATE 17,29:PRINT "PUSH A TO FINISH" |
| 0000010 | |
| 0000011 | WHILE TRUE |
| 0000012 | B=BUTTON(0) |
| 0000013 | IF B AND 16 THEN BREAK |
| 0000014 | IF B AND 1 THEN |
| 0000015 | DEC Y:SPCHR 0,608+N |
| 0000016 | ENDIF |
| 0000017 | IF B AND 2 THEN |
| 0000018 | INC Y:SPCHR 0,600+N |
| 0000019 | ENDIF |
| 0000020 | IF B AND 4 THEN |
| 0000021 | DEC X:SPCHR 0,604+N |
| 0000022 | ENDIF |
| 0000023 | IF B AND 8 THEN |
| 0000024 | INC X:SPCHR 0,596+N |
| 0000025 | ENDIF |
| 0000026 | INC C |
| 0000027 | IF (C DIV 10)==1 THEN |
| 0000028 | C=0:INC N:IF N>3 THEN N=0 |
| 0000029 | ENDIF |
| 0000030 | SPOFS 0,X,Y |
| 0000031 | VSYNC 1 |
| 0000032 | WEND |
| 0000033 | ACLS:END |
