
参考資料
§ 基本マップ(仮想スクリーン) §
平面(バードビュー)マップスクロール
仮想スクリーンの利用
ロールプレイングゲームやアクションゲーム等に於いて、キャラクタ(スプライト)の進める処、進めない処を判別するのに、仮想スクリーンを用いるのが一般的で有る。
下記のプログラムでは、進める処と進めない処を判別する為の関数CHKMOVEをコード末で定義して居る。猶、進めない処を格納する配列NAには、現在1個(海を表す0)しか設定されて居ないが、将来の拡張の為に、配列と仕て居る。
即ち、関数CHKMOVEでは、キャラクタの進行方向の配列MAPの値を調べ、配列NAに含まれる値なら、進めない事を意味するフラグFALSEを返し、含まれない値なら、進める事を意味するフラグTRUEを返します。
画面以上の大きさのマップをスクロールさせるには、キャラクタを画面中央に置いて、マップを移動させるのが一般的で有る(キャラクタが画面に端に来れば、画面をスクロールさせる方法も有る)。勿論、マップの両端では、キャラクタが移動して、マップの端へ行ける様に仕なければ成らない。詳細に付いては、横スクロール(キャラ中央型)を参照され度い。
※ マップを表示する迄のコードは、マップエディタ(公開キー:D23P4PD)で生成されます。
| 0000007 | OPTION STRICT |
| 0000008 | ACLS |
| 0000009 | DIM I,J,B,C,N,X,Y |
| 0000010 | DIM MW=100 ' マップ幅 |
| 0000011 | DIM MH=60 ' マップ高さ |
| 0000012 | DIM CHIP[30] ' マップチップデータ |
| 0000013 | DIM MAP[MW,MH] ' マップデータ |
| 0000014 | DIM CX,CY ' キャラクタ座標 |
| 0000015 | DIM BX,BY ' 背景座標 |
| 0000016 | DIM FX,FY ' 小舟座標 |
| 0000017 | DIM NA[1] ' 進行不可 |
| 0000018 | |
| 0000019 | NA[0]=0 ' 必要に応じて追加 |
| 0000020 | |
| 0000021 | BGSCREEN 0,100,60 |
| 0000022 | RESTORE @CHIPDATA |
| 0000023 | FOR I=0 TO 29 |
| 0000024 | READ CHIP[I] |
| 0000025 | NEXT |
| 0000026 | RESTORE @MAPDATA |
| 0000027 | FOR I=0 TO 59 |
| 0000028 | FOR J=0 TO 99 |
| 0000029 | READ MAP[J,I] |
| 0000030 | NEXT |
| 0000031 | NEXT |
| 0000032 | |
| 0000033 | @CHIPDATA |
| 0000034 | DATA 0,97,32896,49280,32864,49248,32897,32900 |
| 0000035 | DATA 4225,16514,16480,16513,129,16512,12417 |
| 0000036 | DATA 128,130,96,12385,32898,32865,49282,49281 |
| 0000037 | DATA 4224,4192,12416,33269,37365,4597,501 |
| 0000038 | @MAPDATA |
| 0000039 | ' 省略 |
| 0000408 | |
| 0000409 | BGSCREEN 1,100,60 |
| 0000410 | BGFILL 1,0,0,99,59,158 |
| 0000411 | BGOFS 1,0,0,1024 |
| 0000412 | |
| 0000413 | FOR I=0 TO 59 ' 背景の描画 |
| 0000414 | FOR J=0 TO 99 |
| 0000415 | IF MAP[J,I]1=0 THEN |
| 0000416 | BGPUT 0,J,I,CHIP[MAP[J,I]] |
| 0000417 | ENDIF |
| 0000418 | NEXT |
| 0000419 | NEXT |
| 0000420 | |
| 0000421 | CX=272:CY=112 ' 主人公の描画 |
| 0000422 | SPSET 0,500 |
| 0000423 | SPOFS 0,CX,CY |
| 0000424 | |
| 0000425 | FX=240:FY=96 ' 小舟の描画 |
| 0000426 | SPSET 1,384 |
| 0000427 | SPOFS 1,FX,FY |
| 0000428 | |
| 0000429 | BX=0:BY=0:C=0:N=0 ' 背景座標とカウンタの初期化 |
| 0000430 | WHILE TRUE ' 無限ループ |
| 0000431 | B=BUTTON(0) ' ボタン状態の取得 |
| 0000432 | |
| 0000433 | ' 終了(強制脱出) |
| 0000434 | IF B AND 64 THEN BREAK ' Xボタン |
| 0000435 | |
| 0000436 | ' 上方移動 |
| 0000437 | IF B AND 1 THEN ' 十字ボタン上 |
| 0000438 | SPCHR 0,508+N |
| 0000439 | IF CHKMOVE(BX+CX+8,BY+CY+10) THEN |
| 0000440 | IF CY>112 THEN |
| 0000441 | DEC CY:IF CY<112 THEN CY=112 |
| 0000442 | ELSE |
| 0000443 | DEC BY:IF BY<0 THEN BY=0 |
| 0000444 | IF BY==0 THEN |
| 0000445 | DEC CY:IF CY<0 THEN CY=0 |
| 0000446 | ENDIF |
| 0000447 | ENDIF |
| 0000448 | ENDIF |
| 0000449 | ENDIF |
| 0000450 | |
| 0000451 | ' 下方移動 |
| 0000452 | IF B AND 2 THEN ' 十字ボタン下 |
| 0000453 | SPCHR 0,500+N |
| 0000454 | IF CHKMOVE(BX+CX+8,BY+CY+22) THEN |
| 0000455 | IF CY<112 THEN |
| 0000456 | INC CY:IF CY>112 THEN CY=112 |
| 0000457 | ELSE |
| 0000458 | INC BY:IF BY>720 THEN BY=720 |
| 0000459 | IF BY==720 THEN |
| 0000460 | INC CY:IF CY>224 THEN CY=224 |
| 0000461 | ENDIF |
| 0000462 | ENDIF |
| 0000463 | ENDIF |
| 0000464 | ENDIF |
| 0000465 | |
| 0000466 | ' 左側移動 |
| 0000467 | IF B AND 4 THEN ' 十字ボタン左 |
| 0000468 | SPCHR 0,504+N |
| 0000469 | IF CHKMOVE(BX+CX,BY+CY+10) THEN |
| 0000470 | IF CX>192 THEN |
| 0000471 | DEC CX:IF CX<192 THEN CX=192 |
| 0000472 | ELSE |
| 0000473 | DEC BX:IF BX<0 THEN BX=0 |
| 0000474 | IF BX==0 THEN |
| 0000475 | DEC CX:IF CX<0 THEN CX=0 |
| 0000476 | ENDIF |
| 0000477 | ENDIF |
| 0000478 | ENDIF |
| 0000479 | ENDIF |
| 0000480 | |
| 0000481 | ' 右側移動 |
| 0000482 | IF B AND 8 THEN ' 十字ボタン右 |
| 0000483 | SPCHR 0,496+N |
| 0000484 | IF CHKMOVE(BX+CX+16,BY+CY+10) THEN |
| 0000485 | IF CY<192 THEN |
| 0000486 | INC CX:IF CX>192 THEN CX=192 |
| 0000487 | ELSE |
| 0000488 | INC BX:IF BX>1200 THEN BX=1200 |
| 0000489 | IF BY==1200 THEN |
| 0000490 | INC CX:IF CX>384 THEN CX=384 |
| 0000491 | ENDIF |
| 0000492 | ENDIF |
| 0000493 | ENDIF |
| 0000494 | ENDIF |
| 0000495 | |
| 0000496 | ' ループカウンタ |
| 0000497 | INC C |
| 0000498 | IF (C DIV 10)==1 THEN |
| 0000499 | C=0:INC N:IF N>3 THEN N=0 |
| 0000500 | ENDIF |
| 0000501 | |
| 0000502 | ' 再描画 |
| 0000503 | BGOFS 0,BX,BY |
| 0000504 | SPOFS 0,CX,CY |
| 0000505 | SPOFS 1,FX-BX,FY-BY |
| 0000506 | |
| 0000507 | VSYNC 1 ' 時間調整 |
| 0000508 | WEND |
| 0000509 | ACLS:END |
| 0000510 | |
| 0000511 | DEF CHKMOVE(X,Y) ' 進行可能か検証する関数 |
| 0000512 | DIM N=MAP[X DIV 15,Y DIV 16] |
| 0000513 | DIM F=TRUE |
| 0000514 | FOR I=0 8LEN(NA)-1) |
| 0000515 | IF NA[I]==N THEN |
| 0000516 | F=FALSE:BREAK |
| 0000517 | ENDIF |
| 0000518 | NEXT |
| 0000519 | RETURN F |
| 0000520 | END |
プログラムの説明
下記のプログラムでは、スプライトが、
ボタンで上下左右にアニメーションしながら動きます。海の部分には進めません。

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