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

プチコン3号


参考資料

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

側面(サイドビュー)マップ1

仮想スクリーンの利用

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

下記のプログラムでは、マップデータを表すDATA文で、進める処(0)、進めない処(1)を定義し、マップデータ用の配列MAPに格納し、此の値が1の時は壁を表示して進めない処とし、0の時は何も表示せず進める処として居る。

RESTORE @MAPDATA
FOR I=0 TO 14
  FOR J=0 TO 24
    READ MAP[J,I]
  NEXT
NEXT

@MAPDATA
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1
DATA 1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,0,1
DATA 1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
DATA 1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
DATA 1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
DATA 1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
DATA 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

キャラクタの進行方向の配列MAPの値を調べ、0ならば進め、其れ以外なら何もしない(即ち、進めない)で居ます。

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

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

0000001OPTION STRICT
0000002ACLS
0000003DIM I,J,B,C=0,N=0,X=1,Y=12,DR=1,JP=0,FL=0
0000004DIM CHIP[2]
0000005DIM MAP[25,15]
0000006
0000007BGSCREEN 0,25,15
0000008RESTORE @CHIPDATA
0000009FOR I=0 TO 1
0000010  READ CHIP[I]
0000011NEXT
0000012RESTORE @MAPDATA
0000013FOR I=0 TO 14
0000014  FOR J=0 TO 24
0000015    READ MAP[J,I]
0000016  NEXT
0000017NEXT
0000018
0000019@CHIPDATA
0000020DATA 0,491
0000021@MAPDATA
0000022DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000023DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000024DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000025DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1
0000026DATA 1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000027DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000028DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,0,1
0000029DATA 1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000030DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
0000031DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
0000032DATA 1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000033DATA 1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000034DATA 1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000035DATA 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000036DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000037
0000038FOR I=0 TO 14
0000039  FOR J=0 TO 24
0000040    BGPUT 0,J,I,CHIP[MAP[J,I]]
0000041  NEXT
0000042NEXT
0000043
0000044SPSET 0,596
0000045SPOFS 0,X*16,Y*16
0000046
0000047GPRIO -128
0000048GPUTCHR 136,4,"PUSH X TO FINISH",1,1,#WHITE
0000049
0000050C=0:N=0
0000051WHILE TRUE
0000052  B=BUTTON(0)
0000053  
0000054  'QUIT
0000055  IF B AND 64 THEN BREAK
0000056  
0000057  'LEFT MOVE
0000058  IF B AND 4 THEN
0000059    SPCHR 0,604+N:dr=-1
0000060    IF MAP[X-1,Y]==0 THEN
0000061      DEC X:
0000062    ENDIF
0000063  ENDIF
0000064  
0000065  'RIGHT MOVE
0000066  IF B AND 8 THEN
0000067    SPCHR 0,596+N:dr=1
0000068    IF MAP[X+1,Y]==0 THEN
0000069      INNC X:
0000070    ENDIF
0000071  ENDIF
0000072  
0000073  'NEUTRAL
0000074  IF (B AND 12)==0 THEN
0000075    SPCHR 0,600:DR=0
0000076  ENDIF
0000077  
0000078  'JUMP
0000079  IF B AND 16 THEN
0000080    IF FL==0 THEN
0000081      IF MAP[X+DR,Y-1]==0 THEN
0000082        INC X,DR:DEC Y
0000083        INC JP:IF JP>3 THEN JP=0:FL=1
0000084      ELSE
0000085        JP=0:FL=1
0000086      EMDIF
0000087    ENDIF
0000088  ELSE
0000089    IF JP>0 THEN JP=0:FL=1
0000090  ENDIF
0000091  
0000092  'FALL DOWN
0000093  IF JP==0 && MAP[X,Y+1]==0 THEN FL=1
0000094  IF FL==1 THEN
0000095    IF MAP[X,Y+1]!=0 THEN
0000096      FL=0
0000097    ELSE
0000098      INC Y
0000099    ENDIF
0000100  ENDIF
0000101  
0000102  'LOOP COUNTER
0000103  INC C
0000104  IF (C DIV 10)==1 THEN
0000105    C=0:INC N:IF N>3 THEN N=0
0000106  ENDIF
0000107  
0000108  SPOFS 0,X,Y
0000109  
0000110  VSYNC 1
0000111WEND
0000112ACLS:END

プログラムの説明

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



BGGET関数の利用

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

下記のプログラムでは、BGGET関数で取得したBG画面のBGキャラ情報が、0(空白)の時は、進める処と判別して居る。猶、BGGET関数の第4引数は、座標系フラグで、0の時(又は省略時)はキャラクタ(グリッド)単位で、1の時はドット(ピクセル)単位と成ります。

0000001OPTION STRICT
0000002ACLS
0000003DIM I,J,B,C=0,N=0,X=1,Y=12,DR=1,JP=0,FL=0
0000004DIM CHIP[2]
0000005DIM MAP[25,15]
0000006
0000007BGSCREEN 0,25,15
0000008RESTORE @CHIPDATA
0000009FOR I=0 TO 1
0000010  READ CHIP[I]
0000011NEXT
0000012RESTORE @MAPDATA
0000013FOR I=0 TO 14
0000014  FOR J=0 TO 24
0000015    READ N
0000016    BGPUT 0,J,I,CHIP[N]
0000017  NEXT
0000018NEXT
0000019
0000020@CHIPDATA
0000021DATA 0,491
0000022@MAPDATA
0000023DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000024DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000025DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000026DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1
0000027DATA 1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000028DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000029DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,0,1
0000030DATA 1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,1
0000031DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
0000032DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
0000033DATA 1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000034DATA 1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000035DATA 1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000036DATA 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1
0000037DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0000038
0000039SPSET 0,596
0000040SPOFS 0,X*16,Y*16
0000041
0000042GPRIO -128
0000043GPUTCHR 136,4,"PUSH X TO FINISH",1,1,#WHITE
0000044
0000045C=0:N=0
0000046WHILE TRUE
0000047  B=BUTTON(0)
0000048  
0000049  'QUIT
0000050  IF B AND 64 THEN BREAK
0000051  
0000052  'LEFT MOVE
0000053  IF B AND 4 THEN
0000054    SPCHR 0,604+N:dr=-1
0000055    IF BGGET(0,X-1,Y)==0 THEN
0000056      DEC X:
0000057    ENDIF
0000058  ENDIF
0000059  
0000060  'RIGHT MOVE
0000061  IF B AND 8 THEN
0000062    SPCHR 0,596+N:dr=1
0000063    IF BGGET(0,X+1,Y)==0 THEN
0000064      INNC X:
0000065    ENDIF
0000066  ENDIF
0000067  
0000068  'NEUTRAL
0000069  IF (B AND 12)==0 THEN
0000070    SPCHR 0,600:DR=0
0000071  ENDIF
0000072  
0000073  'JUMP
0000074  IF B AND 16 THEN
0000075    IF FL==0 THEN
0000076      IF BGGET(0,X+DR,Y-1)==0 THEN
0000077        INC X,DR:DEC Y
0000078        INC JP:IF JP>3 THEN JP=0:FL=1
0000079      ELSE
0000080        JP=0:FL=1
0000081      EMDIF
0000082    ENDIF
0000083  ELSE
0000084    IF JP>0 THEN JP=0:FL=1
0000085  ENDIF
0000086  
0000087  'FALL DOWN
0000088  IF JP==0 && BGGET(0,X,Y+1)==0 THEN FL=1
0000089  IF FL==1 THEN
0000090    IF BGGET(0,X,Y+1)!=0 THEN
0000091      FL=0
0000092    ELSE
0000093      INC Y
0000094    ENDIF
0000095  ENDIF
0000096  
0000097  'LOOP COUNTER
0000098  INC C
0000099  IF (C DIV 10)==1 THEN
0000100    C=0:INC N:IF N>3 THEN N=0
0000101  ENDIF
0000102  
0000103  SPOFS 0,X,Y
0000104  
0000105  VSYNC 1
0000106WEND
0000107ACLS:END




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

Copyright © King of Squid, All rights reserved.