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

プチコン3号


参考資料

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

側面(サイドビュー)マップスクロール

仮想スクリーンの利用

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

下記のプログラムでは、進める処と進めない処を判別するのに、直接キャラクタの進行方向の配列MAPの値を調べて居ます。詳細に付いては、平面マップ2側面マップ2を参照して下さい。

側面マップ(サイドビュー)では、上下移動には、梯子を使用するか、ジャンプを行う事に成ります。梯子の場合は、基本的に平面マップ(バードビュー)と同じなので、此処では、ジャンプに依る方法を採用しました。

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

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

0000007OPTION STRICT
0000008ACLS
0000009DIM I,J,B,C=0,N=0,L,R,U,D
0000010DIM X=16,Y=192,BX=0,BY=0,AC=0,DR=0,ST=0
0000011DIM CHIP[2]
0000012DIM MAP[100,15]
0000013
0000014BGSCREEN 0,100,15
0000015RESTORE @CHIPDATA
0000016FOR I=0 TO 1
0000017  READ CHIP[I]
0000018NEXT
0000019RESTORE @MAPDATA
0000020FOR I=0 TO 14
0000021  FOR J=0 TO 99
0000022    READ MAP[J,I]
0000023  NEXT
0000024NEXT
0000025
0000026@CHIPDATA
0000027DATA 0,491
0000028@MAPDATA
0000029DATA 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000030DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000031DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000032DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000033DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000034DATA 1,1,1,1,1
0000035DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000036DATA 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1
0000037DATA 1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0
0000038DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000039DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000040DATA 0,0,0,0,1
0000041DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000042DATA 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1
0000043DATA 1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0
0000044DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000045DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000046DATA 0,0,0,0,1
0000047DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000048DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0
0000049DATA 1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
0000050DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000051DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000052DATA 0,0,0,0,1
0000053DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1
0000054DATA 0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0
0000055DATA 1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
0000056DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000057DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1
0000058DATA 0,0,0,0,1
0000059DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1
0000060DATA 0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0
0000061DATA 1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0
0000062DATA 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0
0000063DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000064DATA 0,0,0,0,1
0000065DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1
0000066DATA 1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0
0000067DATA 1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0
0000068DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000069DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000070DATA 0,0,0,0,1
0000071DATA 1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
0000072DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0
0000073DATA 1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0
0000074DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000075DATA 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0000076DATA 0,0,0,0,1
0000077DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000078DATA 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0
0000079DATA 1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1
0000080DATA 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000081DATA 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0
0000082DATA 0,0,0,0,1
0000083DATA 1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
0000084DATA 0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1
0000085DATA 1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0
0000086DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000087DATA 0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1
0000088DATA 0,0,0,0,1
0000089DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000090DATA 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
0000091DATA 0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0
0000092DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000093DATA 0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0
0000094DATA 0,0,0,0,1
0000095DATA 1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1
0000096DATA 0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
0000097DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000098DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
0000099DATA 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
0000100DATA 0,0,1,1,1
0000101DATA 1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1
0000102DATA 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
0000103DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0000104DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
0000105DATA 0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
0000106DATA 0,0,1,1,1
0000107DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000108DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000109DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1
0000110DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1
0000111DATA 1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1
0000112DATA 0,0,1,1,1
0000113DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000114DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000115DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1
0000116DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1
0000117DATA 1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1
0000118DATA 0,0,1,1,1,
0000119
0000120FOR I=0 TO 14
0000121  FOR J=0 TO 99
0000122    BGPUT 0,J,I,CHIP[MAP[J,I]]
0000123  NEXT
0000124NEXT
0000125
0000126SPSET 0,596
0000127SPOFS 0,X,Y
0000128
0000129GPRIO -128
0000130GPUTCHR 136,4,"PUSH X TO FINISH",1,1,#WHITE
0000131
0000132WHILE 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
0000221WEND
0000222ACLS:END

プログラムの説明

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



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.