
参考資料
§ 基本マップ(仮想スクリーン) §
側面(サイドビュー)マップスクロール
仮想スクリーンの利用
ロールプレイングゲームやアクションゲーム等に於いて、キャラクタ(スプライト)の進める処、進めない処を判別するのに、仮想スクリーンを用いるのが一般的で有る。
下記のプログラムでは、進める処と進めない処を判別するのに、直接キャラクタの進行方向の配列MAPの値を調べて居ます。詳細に付いては、平面マップ2や側面マップ2を参照して下さい。
側面マップ(サイドビュー)では、上下移動には、梯子を使用するか、ジャンプを行う事に成ります。梯子の場合は、基本的に平面マップ(バードビュー)と同じなので、此処では、ジャンプに依る方法を採用しました。
画面以上の大きさのマップをスクロールさせるには、キャラクタを画面中央に置いて、マップを移動させるのが一般的で有る(キャラクタが画面に端に来れば、画面をスクロールさせる方法も有る)。勿論、マップの両端では、キャラクタが移動して、マップの端へ行ける様に仕なければ成らない。詳細に付いては、横スクロール(キャラ中央型)を参照され度い。
※ マップを表示する迄のコードは、マップエディタ(公開キー:D23P4PD)で生成されます。
| 0000007 | OPTION STRICT |
| 0000008 | ACLS |
| 0000009 | DIM I,J,B,C=0,N=0,L,R,U,D |
| 0000010 | DIM X=16,Y=192,BX=0,BY=0,AC=0,DR=0,ST=0 |
| 0000011 | DIM CHIP[2] |
| 0000012 | DIM MAP[100,15] |
| 0000013 | |
| 0000014 | BGSCREEN 0,100,15 |
| 0000015 | RESTORE @CHIPDATA |
| 0000016 | FOR I=0 TO 1 |
| 0000017 | READ CHIP[I] |
| 0000018 | NEXT |
| 0000019 | RESTORE @MAPDATA |
| 0000020 | FOR I=0 TO 14 |
| 0000021 | FOR J=0 TO 99 |
| 0000022 | READ MAP[J,I] |
| 0000023 | NEXT |
| 0000024 | NEXT |
| 0000025 | |
| 0000026 | @CHIPDATA |
| 0000027 | DATA 0,491 |
| 0000028 | @MAPDATA |
| 0000029 | DATA 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000030 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000031 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000032 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000033 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000034 | DATA 1,1,1,1,1 |
| 0000035 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000036 | DATA 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1 |
| 0000037 | DATA 1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0 |
| 0000038 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000039 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000040 | DATA 0,0,0,0,1 |
| 0000041 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000042 | DATA 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1 |
| 0000043 | DATA 1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0 |
| 0000044 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000045 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000046 | DATA 0,0,0,0,1 |
| 0000047 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000048 | DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 |
| 0000049 | DATA 1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000050 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000051 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000052 | DATA 0,0,0,0,1 |
| 0000053 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1 |
| 0000054 | DATA 0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 |
| 0000055 | DATA 1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000056 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000057 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1 |
| 0000058 | DATA 0,0,0,0,1 |
| 0000059 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1 |
| 0000060 | DATA 0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 |
| 0000061 | DATA 1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0 |
| 0000062 | DATA 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0 |
| 0000063 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000064 | DATA 0,0,0,0,1 |
| 0000065 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1 |
| 0000066 | DATA 1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 |
| 0000067 | DATA 1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0 |
| 0000068 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000069 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000070 | DATA 0,0,0,0,1 |
| 0000071 | DATA 1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 |
| 0000072 | DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 |
| 0000073 | DATA 1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0 |
| 0000074 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000075 | DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 |
| 0000076 | DATA 0,0,0,0,1 |
| 0000077 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000078 | DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 |
| 0000079 | DATA 1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1 |
| 0000080 | DATA 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000081 | DATA 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0 |
| 0000082 | DATA 0,0,0,0,1 |
| 0000083 | DATA 1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 |
| 0000084 | DATA 0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1 |
| 0000085 | DATA 1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 |
| 0000086 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000087 | DATA 0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1 |
| 0000088 | DATA 0,0,0,0,1 |
| 0000089 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000090 | DATA 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 |
| 0000091 | DATA 0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0 |
| 0000092 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000093 | DATA 0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0 |
| 0000094 | DATA 0,0,0,0,1 |
| 0000095 | DATA 1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1 |
| 0000096 | DATA 0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0 |
| 0000097 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000098 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 |
| 0000099 | DATA 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 |
| 0000100 | DATA 0,0,1,1,1 |
| 0000101 | DATA 1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1 |
| 0000102 | DATA 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000103 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 0000104 | DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 |
| 0000105 | DATA 0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 |
| 0000106 | DATA 0,0,1,1,1 |
| 0000107 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000108 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000109 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1 |
| 0000110 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1 |
| 0000111 | DATA 1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1 |
| 0000112 | DATA 0,0,1,1,1 |
| 0000113 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000114 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
| 0000115 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1 |
| 0000116 | DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1 |
| 0000117 | DATA 1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1 |
| 0000118 | DATA 0,0,1,1,1, |
| 0000119 | |
| 0000120 | FOR I=0 TO 14 |
| 0000121 | FOR J=0 TO 99 |
| 0000122 | BGPUT 0,J,I,CHIP[MAP[J,I]] |
| 0000123 | NEXT |
| 0000124 | NEXT |
| 0000125 | |
| 0000126 | SPSET 0,596 |
| 0000127 | SPOFS 0,X,Y |
| 0000128 | |
| 0000129 | GPRIO -128 |
| 0000130 | GPUTCHR 136,4,"PUSH X TO FINISH",1,1,#WHITE |
| 0000131 | |
| 0000132 | WHILE TRUE |
| 0000133 | B=BUTTON(0) |
| 0000134 | |
| 0000135 | ' 終了(強制脱出) |
| 0000136 | IF B AND 64 THEN BREAK ' Xボタン |
| 0000137 | |
| 0000138 | ' 左側移動 |
| 0000139 | IF B AND 4 THEN ' 十字ボタン左 |
| 0000140 | SPCHR 0,604+N:DR=-1 |
| 0000141 | U=MAP[(X+BX-1) DIV 16,Y DIV 16] |
| 0000142 | D=MAP[(X+BX-1) DIV 16,(Y+15) DIV 16] |
| 0000143 | IF U==0 && D==0 THEN |
| 0000144 | IF X>184 THEN |
| 0000145 | DEC X:IF X<184 THEN X=184 |
| 0000146 | ELSE |
| 0000147 | DEC BX:IF BX<0 THEN BX=0 |
| 0000148 | IF BX==0 THEN |
| 0000149 | DEC X:IF X<16 THEN X=16 |
| 0000150 | ENDIF |
| 0000151 | ENDIF |
| 0000152 | ENDIF |
| 0000153 | ENDIF |
| 0000154 | |
| 0000155 | ' 右側移動 |
| 0000156 | IF B AND 8 THEN ' 十字ボタン右 |
| 0000157 | SPCHR 0,596+N:DR=1 |
| 0000158 | U=MAP[(X+BX+16) DIV 16 ,Y DIV 16] |
| 0000159 | D=MAP[(X+BX+16) DIV 16 ,(Y+15) DIV 16] |
| 0000160 | IF U==0 && D==0 THEN |
| 0000161 | IF X<184 THEN |
| 0000162 | INC X:IF X>184 THEN X=184 |
| 0000163 | ELSE |
| 0000164 | DEC BX:IF BX>1200 THEN BX=1200 |
| 0000165 | IF BX==1200 THEN |
| 0000166 | INC X:IF X>367 THEN X=367 |
| 0000167 | ENDIF |
| 0000168 | ENDIF |
| 0000169 | ENDIF |
| 0000170 | ENDIF |
| 0000171 | |
| 0000172 | ' 中立(十字ボタン左右が押されて居ない場合) |
| 0000173 | IF (B AND 12)==0 THEN |
| 0000174 | SPCHR 0,600:DR=0 |
| 0000175 | ENDIF |
| 0000176 | |
| 0000177 | ' ジャンプ |
| 0000178 | IF B AND 16 THEN ' Aボタン |
| 0000179 | IF ST<2 THEN |
| 0000180 | ST=1:INC AC,1.8:IF AC>5.5 THEN AC=5.5:ST=2 |
| 0000181 | ENDIF |
| 0000182 | ENDIF |
| 0000183 | |
| 0000184 | ' 下方チェック |
| 0000185 | IF ST==0 THEN |
| 0000186 | L=MAP[(X+BX ) DIV 16,(Y+16) DIV 16) |
| 0000187 | R=MAP[(X+BX+15) DIV 16,(Y+16) DIV 16) |
| 0000188 | IF (L==0) && (R==0) THEN |
| 0000189 | AC=0:ST=2 |
| 0000190 | ENDIF |
| 0000191 | ENDIF |
| 0000192 | |
| 0000193 | ' 落下 |
| 0000194 | IF ST>0 THEN |
| 0000195 | DEC AC,0.32 |
| 0000196 | DEC Y,AC |
| 0000197 | ' 頭上チェック |
| 0000198 | L=MAP[(X+BX+ 2) DIV 16,(Y-1) DIV 16) |
| 0000199 | R=MAP[(X+BX+13) DIV 16,(Y-1) DIV 16) |
| 0000200 | IF (L!=0) || (R!=0) THEN |
| 0000201 | AC=0 |
| 0000202 | ENDIF |
| 0000203 | ' 足元チェック |
| 0000204 | L=MAP[(X+BX ) DIV 16,(Y+16) DIV 16) |
| 0000205 | R=MAP[(X+BX+15) DIV 16,(Y+16) DIV 16) |
| 0000206 | IF (L!=0) || (R!=0) THEN |
| 0000207 | Y=((Y+16) DIV 16-1)*16:ST=0 |
| 0000208 | ENDIF |
| 0000209 | ENDIF |
| 0000210 | |
| 0000211 | ' ループカウンタ |
| 0000212 | INC C |
| 0000213 | IF (C DIV 10)==1 THEN |
| 0000214 | C=0:INC N:IF N>3 THEN N=0 |
| 0000215 | ENDIF |
| 0000216 | |
| 0000217 | BGOFS 0,BX,BY |
| 0000218 | SPOFS 0,X,Y |
| 0000219 | |
| 0000220 | VSYNC 1 |
| 0000221 | WEND |
| 0000222 | ACLS:END |
プログラムの説明
下記のプログラムでは、スプライトが、
ボタンで左右にアニメーションしながら動き、
ボタンでジャンプします。壁の部分には進めません。

BGGET関数の利用
プチコン3号(Smile BASIC)では、BGGET関数に依り、BGキャラの情報を取得出来るので、仮想スクリーンを用いなくても、BG画面の情報で、マップ情報を知る事が出来る。
即ち、BGGET関数で取得したBG画面のBGキャラ情報が、配列NAに含まれない時は、進める処と判別すれば良い。猶、BGGET関数の第4引数は、座標系フラグで、0の時(又は省略時)はキャラクタ(グリッド)単位で、1の時はドット(ピクセル)単位と成ります。