
参考資料
§ 基本マップ(仮想スクリーン) §
平面(バードビュー)マップ1
仮想スクリーンの利用
ロールプレイングゲームやアクションゲーム等に於いて、キャラクタ(スプライト)の進める処、進めない処を判別するのに、仮想スクリーンを用いるのが一般的で有る。
下記のプログラムでは、マップデータを表すDATA文で、進める処(2)、進めない処(1)を定義し、マップデータ用の配列MAPに格納し、此の値が1の時は山を表示して進めない処とし、2の時は草原を表示して進める処として居る。
FOR I=0 TO 11
FOR J=0 TO 11
READ MAP[J,I]
NEXT
NEXT
@MAPDATA
DATA 1,1,1,1,1,1,1,1,1,1,1,1
DATA 1.2.1.2.2.2.1.2.2.2.2.1
DATA 1,2,1,2,1,2,1,2,1,1,2,1
DATA 1,2,1,2,1,2,1,2,1,2,2,1
DATA 1,2,2,2,1,2,1,2,1,2,1,1
DATA 1,1,1,1,1,2,1,2,1,2,2,1
DATA 1,2,2,2,2,2,1,2,1,1,2,1
DATA 1,2,1,1,1,1,1,2,1,2,2,1
DATA 1,2,2,2,2,2,2,2,1,2,1,1
DATA 1,2,1,1,1,1,1,1,1,2,1,1
DATA 1,2,2,2,2,2,2,2,2,2,1,1
DATA 1,1,1,1,1,1,1,1,1,1,1,1
キャラクタの進行方向の配列MAPの値を調べ、2ならば進め、其れ以外なら何もしない(即ち、進めない)で居ます。
※ マップを表示する迄のコードは、マップエディタ(公開キー:D23P4PD)で生成されます。
| 0000001 | OPTION STRICT |
| 0000002 | ACLS |
| 0000003 | DIM I,J,B,X=1,Y=1 |
| 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*16,Y*16 |
| 0000043 | |
| 0000044 | WHILE TRUE |
| 0000045 | B=BUTTON(0) |
| 0000046 | |
| 0000047 | 'QUIT |
| 0000048 | IF B AND 64 THEN BREAK |
| 0000049 | |
| 0000050 | 'UP MOVE |
| 0000051 | IF B AND 1 THEN |
| 0000052 | IF MAP[X,Y-1]==2 THEN |
| 0000053 | DEC Y |
| 0000054 | SPANIM 0,"I",8,609,8,610,8,611,8,608,1 |
| 0000055 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000056 | WAIT 10 |
| 0000057 | ENDIF |
| 0000058 | ENDIF |
| 0000059 | |
| 0000060 | 'DOWN MOVE |
| 0000061 | IF B AND 2 THEN |
| 0000062 | IF MAP[X,Y+1]==2 THEN |
| 0000063 | INC Y |
| 0000064 | SPANIM 0,"I",8,601,8,602,8,603,8,600,1 |
| 0000065 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000066 | WAIT 10 |
| 0000067 | ENDIF |
| 0000068 | ENDIF |
| 0000069 | |
| 0000070 | 'LEFT MOVE |
| 0000071 | IF B AND 4 THEN |
| 0000072 | IF MAP[X-1,Y]==2 THEN |
| 0000073 | DEC X |
| 0000074 | SPANIM 0,"I",8,605,8,606,8,607,8,604,1 |
| 0000075 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000076 | WAIT 10 |
| 0000077 | ENDIF |
| 0000078 | ENDIF |
| 0000079 | |
| 0000080 | 'RIGHT MOVE |
| 0000081 | IF B AND 8 THEN |
| 0000082 | IF MAP[X+1,Y]==2 THEN |
| 0000083 | INC X |
| 0000084 | SPANIM 0,"I",8,597,8,598,8,599,8,596,1 |
| 0000085 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000086 | WAIT 10 |
| 0000087 | ENDIF |
| 0000088 | ENDIF |
| 0000089 | |
| 0000090 | VSYNC 1 |
| 0000091 | WEND |
| 0000092 | ACLS:END |
プログラムの説明
下記のプログラムでは、スプライトが、
ボタンで草原部分を上下左右にアニメーションしながら動きます。山の部分には進めません。

BGGET関数の利用
プチコン3号(Smile BASIC)では、BGGET関数に依り、BGキャラの情報を取得出来るので、仮想スクリーンを用いなくても、BG画面の情報で、マップ情報を知る事が出来る。
下記のプログラムでは、BGGET関数で取得したBG画面のBGキャラ情報が、97(草原)の時は、進める処と判別して居る。猶、BGGET関数の第4引数は、座標系フラグで、0の時(又は省略時)はキャラクタ(グリッド)単位で、1の時はドット(ピクセル)単位と成ります。
| 0000001 | OPTION STRICT |
| 0000002 | ACLS |
| 0000003 | DIM I,J,N,B,X=1,Y=1 |
| 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*16,Y*16 |
| 0000038 | |
| 0000039 | WHILE TRUE |
| 0000040 | B=BUTTON(0) |
| 0000041 | |
| 0000042 | 'QUIT |
| 0000043 | IF B AND 64 THEN BREAK |
| 0000044 | |
| 0000045 | 'UP MOVE |
| 0000046 | IF B AND 1 THEN |
| 0000047 | IF BGGET(0,X,Y-1)==97 THEN |
| 0000048 | DEC Y |
| 0000049 | SPANIM 0,"I",8,609,8,610,8,611,8,608,1 |
| 0000050 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000051 | WAIT 10 |
| 0000052 | ENDIF |
| 0000053 | ENDIF |
| 0000054 | |
| 0000055 | 'DOWN MOVE |
| 0000056 | IF B AND 2 THEN |
| 0000057 | IF BGGET(0,X,Y+1)==97 THEN |
| 0000058 | INC Y |
| 0000059 | SPANIM 0,"I",8,601,8,602,8,603,8,600,1 |
| 0000060 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000061 | WAIT 10 |
| 0000062 | ENDIF |
| 0000063 | ENDIF |
| 0000064 | |
| 0000065 | 'LEFT MOVE |
| 0000066 | IF B AND 4 THEN |
| 0000067 | IF BGGET(0,X-1,Y)==97 THEN |
| 0000068 | DEC X |
| 0000069 | SPANIM 0,"I",8,605,8,606,8,607,8,604,1 |
| 0000070 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000071 | WAIT 10 |
| 0000072 | ENDIF |
| 0000073 | ENDIF |
| 0000074 | |
| 0000075 | 'RIGHT MOVE |
| 0000076 | IF B AND 8 THEN |
| 0000077 | IF BGGET(0,X+1,Y)==97 THEN |
| 0000078 | INC X |
| 0000079 | SPANIM 0,"I",8,597,8,598,8,599,8,596,1 |
| 0000080 | SPANIM 0,"XY",-32,X*16,Y*16,1 |
| 0000081 | WAIT 10 |
| 0000082 | ENDIF |
| 0000083 | ENDIF |
| 0000084 | |
| 0000085 | VSYNC 1 |
| 0000086 | WEND |
| 0000087 | ACLS:END |
