烏賊先生のプログラミング道場

プチコン3号


参考資料

§ 基本マップ(仮想スクリーン) §

平面(バードビュー)マップスクロール

仮想スクリーンの利用

ロールプレイングゲームやアクションゲーム等に於いて、キャラクタ(スプライト)の進める処、進めない処を判別するのに、仮想スクリーンを用いるのが一般的で有る。

下記のプログラムでは、進める処と進めない処を判別する為の関数CHKMOVEをコード末で定義して居る。猶、進めない処を格納する配列NAには、現在1個(海を表す0)しか設定されて居ないが、将来の拡張の為に、配列と仕て居る。

即ち、関数CHKMOVEでは、キャラクタの進行方向の配列MAPの値を調べ、配列NAに含まれる値なら、進めない事を意味するフラグFALSEを返し、含まれない値なら、進める事を意味するフラグTRUEを返します。

画面以上の大きさのマップをスクロールさせるには、キャラクタを画面中央に置いて、マップを移動させるのが一般的で有る(キャラクタが画面に端に来れば、画面をスクロールさせる方法も有る)。勿論、マップの両端では、キャラクタが移動して、マップの端へ行ける様に仕なければ成らない。詳細に付いては、横スクロール(キャラ中央型)を参照され度い。

※ マップを表示する迄のコードは、マップエディタ(公開キー:D23P4PD)で生成されます。

0000007OPTION STRICT
0000008ACLS
0000009DIM I,J,B,C,N,X,Y
0000010DIM MW=100     ' マップ幅
0000011DIM MH=60      ' マップ高さ
0000012DIM CHIP[30]   ' マップチップデータ
0000013DIM MAP[MW,MH] ' マップデータ
0000014DIM CX,CY      ' キャラクタ座標
0000015DIM BX,BY      ' 背景座標
0000016DIM FX,FY      ' 小舟座標
0000017DIM NA[1]      ' 進行不可
0000018
0000019NA[0]=0        ' 必要に応じて追加
0000020
0000021BGSCREEN 0,100,60
0000022RESTORE @CHIPDATA
0000023FOR I=0 TO 29
0000024  READ CHIP[I]
0000025NEXT
0000026RESTORE @MAPDATA
0000027FOR I=0 TO 59
0000028  FOR J=0 TO 99
0000029    READ MAP[J,I]
0000030  NEXT
0000031NEXT
0000032
0000033@CHIPDATA
0000034DATA 0,97,32896,49280,32864,49248,32897,32900
0000035DATA 4225,16514,16480,16513,129,16512,12417
0000036DATA 128,130,96,12385,32898,32865,49282,49281
0000037DATA 4224,4192,12416,33269,37365,4597,501
0000038@MAPDATA
0000039' 省略
0000408
0000409BGSCREEN 1,100,60
0000410BGFILL 1,0,0,99,59,158
0000411BGOFS 1,0,0,1024
0000412
0000413FOR 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
0000419NEXT
0000420
0000421CX=272:CY=112 ' 主人公の描画
0000422SPSET 0,500
0000423SPOFS 0,CX,CY
0000424
0000425FX=240:FY=96 ' 小舟の描画
0000426SPSET 1,384
0000427SPOFS 1,FX,FY
0000428
0000429BX=0:BY=0:C=0:N=0 ' 背景座標とカウンタの初期化
0000430WHILE 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 ' 時間調整
0000508WEND
0000509ACLS:END
0000510
0000511DEF 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
0000520END

プログラムの説明

下記のプログラムでは、スプライトが、 ボタンで上下左右にアニメーションしながら動きます。海の部分には進めません。



BGGET関数の利用

プチコン3号(Smile BASIC)では、BGGET関数に依り、BGキャラの情報を取得出来るので、仮想スクリーンを用いなくても、BG画面の情報で、マップ情報を知る事が出来る。

即ち、BGGET関数で取得したBG画面のBGキャラ情報が、配列NAに含まれない時は、進める処と判別すれば良い。猶、BGGET関数の第4引数は、座標系フラグで、0の時(又は省略時)はキャラクタ(グリッド)単位で、1の時はドット(ピクセル)単位と成ります。




ゲームプログラミング道場 ニンテンドー3DS Smile BASIC  Visual Basic,Visual C#

Copyright © King of Squid, All rights reserved.