
参考資料
§ 基本マップ(仮想スクリーン) §
平面(バードビュー)マップ2
仮想スクリーンの利用
キャラクタ(スプライト)を1ドット(ピクセル)単位で移動させる場合、進める処、進めない処を判別するのに、2箇所のチェックが必要と成ります。
ドット座標よりグリッド座標を求めるには、グリッドの幅、高さで整数除算(DIV演算子)を行います。例えば、キャラクタが上に移動する時のコードは、下記の通りです。
'UP MOVE
IF B AND 1 THEN
L=MAP[X DIV 16,(Y-1) DIV 16]
R=MAP[(X+15) DIV 16,(Y-1) DIV 16]
IF L==2 && R==2 THEN
DEC Y:SPCHR 0,608+N
ENDIF
ENDIF
キャラクタの進行方向の配列MAPの値を調べ、2ならば進め、其れ以外なら何もしない(即ち、進めない)で居ます。
※ マップを表示する迄のコードは、マップエディタ(公開キー:D23P4PD)で生成されます。
| 0000001 | OPTION STRICT |
| 0000002 | ACLS |
| 0000003 | DIM I,J,C,N,B,L,R,U,D,X=16,Y=16 |
| 0000004 | DIM CHIP[3] |
| 0000005 | DIM MAP[12,12] |
| 0000006 | |
| 0000007 | BGSCREEN 0,12,12 |
| 0000008 | RESTORE @CHIPDATA |
| 0000009 | FOR I=0 TO 2 |
| 0000010 | READ CHIP[I] |
| 0000011 | NEXT |
| 0000012 | RESTORE @MAPDATA |
| 0000013 | FOR I=0 TO 11 |
| 0000014 | FOR J=0 TO 11 |
| 0000015 | READ MAP[J,I] |
| 0000016 | NEXT |
| 0000017 | NEXT |
| 0000018 | |
| 0000019 | @CHIPDATA |
| 0000020 | DATA 0,101,97 |
| 0000021 | @MAPDATA |
| 0000022 | DATA 1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000023 | DATA 1.2.1.2.2.2.1.2.2.2.2.1 |
| 0000024 | DATA 1,2,1,2,1,2,1,2,1,1,2,1 |
| 0000025 | DATA 1,2,1,2,1,2,1,2,1,2,2,1 |
| 0000026 | DATA 1,2,2,2,1,2,1,2,1,2,1,1 |
| 0000027 | DATA 1,1,1,1,1,2,1,2,1,2,2,1 |
| 0000028 | DATA 1,2,2,2,2,2,1,2,1,1,2,1 |
| 0000029 | DATA 1,2,1,1,1,1,1,2,1,2,2,1 |
| 0000030 | DATA 1,2,2,2,2,2,2,2,1,2,1,1 |
| 0000031 | DATA 1,2,1,1,1,1,1,1,1,2,1,1 |
| 0000032 | DATA 1,2,2,2,2,2,2,2,2,2,1,1 |
| 0000033 | DATA 1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000034 | |
| 0000035 | FOR I=0 TO 11 |
| 0000036 | FOR J=0 TO 11 |
| 0000037 | BGPUT 0,J,I,CHIP[MAP[J,I]] |
| 0000038 | NEXT |
| 0000039 | NEXT |
| 0000040 | |
| 0000041 | SPSET 0,600 |
| 0000042 | SPOFS 0,X,Y |
| 0000043 | |
| 0000044 | C=0:N=0 |
| 0000045 | WHILE TRUE |
| 0000046 | B=BUTTON(0) |
| 0000047 | |
| 0000048 | 'QUIT |
| 0000049 | IF B AND 64 THEN BREAK |
| 0000050 | |
| 0000051 | 'UP MOVE |
| 0000052 | IF B AND 1 THEN |
| 0000053 | L=MAP[X DIV 16,(Y-1) DIV 16] |
| 0000054 | R=MAP[(X+15) DIV 16,(Y-1) DIV 16] |
| 0000055 | IF L==2 && R==2 THEN |
| 0000056 | DEC Y:SPCHR 0,608+N |
| 0000057 | ENDIF |
| 0000058 | ENDIF |
| 0000059 | |
| 0000060 | 'DOWN MOVE |
| 0000061 | IF B AND 2 THEN |
| 0000062 | L=MAP[X DIV 16,(Y+16) DIV 16] |
| 0000063 | R=MAP[(X+15) DIV 16,(Y+16) DIV 16] |
| 0000064 | IF L==2 && R==2 THEN |
| 0000065 | INC Y:SPCHR 0,600+N |
| 0000066 | ENDIF |
| 0000067 | ENDIF |
| 0000068 | |
| 0000069 | 'LEFT MOVE |
| 0000070 | IF B AND 4 THEN |
| 0000071 | U=MAP[(X-1) DIV 16,Y DIV 16] |
| 0000072 | D=MAP[(X-1) DIV 16,(Y+15) DIV 16] |
| 0000073 | IF U==2 && D==2 THEN |
| 0000074 | DEC X:SPCHR 0,604+N |
| 0000075 | ENDIF |
| 0000076 | ENDIF |
| 0000077 | |
| 0000078 | 'RIGHT MOVE |
| 0000079 | IF B AND 8 THEN |
| 0000080 | U=MAP[(X+16) DIV 16,Y DIV 16] |
| 0000081 | D=MAP[(X+16) DIV 16,(Y+15) DIV 16] |
| 0000082 | IF U==2 && D==2 THEN |
| 0000083 | INC X:SPCHR 0,596+N |
| 0000084 | ENDIF |
| 0000085 | ENDIF |
| 0000086 | |
| 0000087 | 'LOOP COUNTER |
| 0000088 | INC C |
| 0000089 | IF (C DIV 10)==1 THEN |
| 0000090 | C=0:INC N:IF N>3 THEN N=0 |
| 0000091 | ENDIF |
| 0000092 | |
| 0000093 | SPOFS 0,X,Y |
| 0000094 | |
| 0000095 | VSYNC 1 |
| 0000096 | WEND |
| 0000097 | ACLS:END |
プログラムの説明
下記のプログラムでは、スプライトが、
ボタンで草原部分を上下左右にアニメーションしながら動きます。山の部分には進めません。

BGGET関数の利用
プチコン3号(Smile BASIC)では、BGGET関数に依り、BGキャラの情報を取得出来るので、仮想スクリーンを用いなくても、BG画面の情報で、マップ情報を知る事が出来る。
IF B AND 1 THEN
L=BGGET(0,X,Y-1,1)
R=BGGET(0,X+15,Y-1,1)
IF L==97 && R==97 THEN
DEC Y:SPCHR 0,608+N
ENDIF
ENDIF
下記のプログラムでは、BGGET関数で取得したBG画面のBGキャラ情報が、97(草原)の時は、進める処と判別して居る。猶、BGGET関数の第4引数は、座標系フラグで、0の時(又は省略時)はキャラクタ(グリッド)単位で、1の時はドット(ピクセル)単位と成ります。
| 0000001 | OPTION STRICT |
| 0000002 | ACLS |
| 0000003 | DIM I,J,C,N,B,L,R,U,D,X=16,Y=16 |
| 0000004 | DIM CHIP[3] |
| 0000005 | DIM MAP[12,12] |
| 0000006 | |
| 0000007 | BGSCREEN 0,12,12 |
| 0000008 | RESTORE @CHIPDATA |
| 0000009 | FOR I=0 TO 2 |
| 0000010 | READ CHIP[I] |
| 0000011 | NEXT |
| 0000012 | RESTORE @MAPDATA |
| 0000013 | FOR I=0 TO 11 |
| 0000014 | FOR J=0 TO 11 |
| 0000015 | READ N |
| 0000016 | BGPUT 0,J,I,CHIP[N] |
| 0000017 | NEXT |
| 0000018 | NEXT |
| 0000019 | |
| 0000020 | @CHIPDATA |
| 0000021 | DATA 0,101,97 |
| 0000022 | @MAPDATA |
| 0000023 | DATA 1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000024 | DATA 1.2.1.2.2.2.1.2.2.2.2.1 |
| 0000025 | DATA 1,2,1,2,1,2,1,2,1,1,2,1 |
| 0000026 | DATA 1,2,1,2,1,2,1,2,1,2,2,1 |
| 0000027 | DATA 1,2,2,2,1,2,1,2,1,2,1,1 |
| 0000028 | DATA 1,1,1,1,1,2,1,2,1,2,2,1 |
| 0000029 | DATA 1,2,2,2,2,2,1,2,1,1,2,1 |
| 0000030 | DATA 1,2,1,1,1,1,1,2,1,2,2,1 |
| 0000031 | DATA 1,2,2,2,2,2,2,2,1,2,1,1 |
| 0000032 | DATA 1,2,1,1,1,1,1,1,1,2,1,1 |
| 0000033 | DATA 1,2,2,2,2,2,2,2,2,2,1,1 |
| 0000034 | DATA 1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000035 | |
| 0000036 | SPSET 0,600 |
| 0000037 | SPOFS 0,X,Y |
| 0000038 | |
| 0000039 | C=0:N=0 |
| 0000040 | WHILE TRUE |
| 0000041 | B=BUTTON(0) |
| 0000042 | |
| 0000043 | 'QUIT |
| 0000044 | IF B AND 64 THEN BREAK |
| 0000045 | |
| 0000046 | 'UP MOVE |
| 0000047 | IF B AND 1 THEN |
| 0000048 | L=BGGET(0,X,Y-1,1) |
| 0000049 | R=BGGET(0,X+15,Y-1,1) |
| 0000050 | IF L==97 && R==97 THEN |
| 0000051 | DEC Y:SPCHR 0,608+N |
| 0000052 | ENDIF |
| 0000053 | ENDIF |
| 0000054 | |
| 0000055 | 'DOWN MOVE |
| 0000056 | IF B AND 2 THEN |
| 0000057 | L=BGGET(0,X,Y+16,1) |
| 0000058 | R=BGGET(0,X+15,Y+16,1) |
| 0000059 | IF L==97 && R==97 THEN |
| 0000060 | INC Y:SPCHR 0,600+N |
| 0000061 | ENDIF |
| 0000062 | ENDIF |
| 0000063 | |
| 0000064 | 'LEFT MOVE |
| 0000065 | IF B AND 4 THEN |
| 0000066 | U=BGGET(0,X-1,Y,1) |
| 0000067 | D=BGGET(0,X-1,Y+15,1) |
| 0000068 | IF L==97 && R==97 THEN |
| 0000069 | DEC X:SPCHR 0,604+N |
| 0000070 | ENDIF |
| 0000071 | ENDIF |
| 0000072 | |
| 0000073 | 'RIGHT MOVE |
| 0000074 | IF B AND 8 THEN |
| 0000075 | U=BGGET(0,X+16,Y,1) |
| 0000076 | D=BGGET(0,X+16,Y+15,1) |
| 0000077 | IF L==97 && R==97 THEN |
| 0000078 | INC X:SPCHR 0,596+N |
| 0000079 | ENDIF |
| 0000080 | ENDIF |
| 0000081 | |
| 0000082 | 'LOOP COUNTER |
| 0000083 | INC C |
| 0000084 | IF (C DIV 10)==1 THEN |
| 0000085 | C=0:INC N:IF N>3 THEN N=0 |
| 0000086 | ENDIF |
| 0000087 | |
| 0000088 | SPOFS 0,X,Y |
| 0000089 | |
| 0000090 | VSYNC 1 |
| 0000091 | WEND |
| 0000092 | ACLS:END |
