参考資料
§ 基本マップ(仮想スクリーン) §
平面(バードビュー)マップ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 |