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

プチコン3号


参考資料

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

平面(バードビュー)マップ1

仮想スクリーンの利用

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

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

FOR I=0 TO 11
  FOR J=0 TO 11
    READ MAP[J,I]
  NEXT
NEXT

@MAPDATA
DATA 1,1,1,1,1,1,1,1,1,1,1,1
DATA 1.2.1.2.2.2.1.2.2.2.2.1
DATA 1,2,1,2,1,2,1,2,1,1,2,1
DATA 1,2,1,2,1,2,1,2,1,2,2,1
DATA 1,2,2,2,1,2,1,2,1,2,1,1
DATA 1,1,1,1,1,2,1,2,1,2,2,1
DATA 1,2,2,2,2,2,1,2,1,1,2,1
DATA 1,2,1,1,1,1,1,2,1,2,2,1
DATA 1,2,2,2,2,2,2,2,1,2,1,1
DATA 1,2,1,1,1,1,1,1,1,2,1,1
DATA 1,2,2,2,2,2,2,2,2,2,1,1
DATA 1,1,1,1,1,1,1,1,1,1,1,1

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

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

0000001OPTION STRICT
0000002ACLS
0000003DIM I,J,B,X=1,Y=1
0000004DIM CHIP[3]
0000005DIM MAP[12,12]
0000006
0000007BGSCREEN 0,12,12
0000008RESTORE @CHIPDATA
0000009FOR I=0 TO 2
0000010  READ CHIP[I]
0000011NEXT
0000012RESTORE @MAPDATA
0000013FOR I=0 TO 11
0000014  FOR J=0 TO 11
0000015    READ MAP[J,I]
0000016  NEXT
0000017NEXT
0000018
0000019@CHIPDATA
0000020DATA 0,101,97
0000021@MAPDATA
0000022DATA 1,1,1,1,1,1,1,1,1,1,1,1
0000023DATA 1.2.1.2.2.2.1.2.2.2.2.1
0000024DATA 1,2,1,2,1,2,1,2,1,1,2,1
0000025DATA 1,2,1,2,1,2,1,2,1,2,2,1
0000026DATA 1,2,2,2,1,2,1,2,1,2,1,1
0000027DATA 1,1,1,1,1,2,1,2,1,2,2,1
0000028DATA 1,2,2,2,2,2,1,2,1,1,2,1
0000029DATA 1,2,1,1,1,1,1,2,1,2,2,1
0000030DATA 1,2,2,2,2,2,2,2,1,2,1,1
0000031DATA 1,2,1,1,1,1,1,1,1,2,1,1
0000032DATA 1,2,2,2,2,2,2,2,2,2,1,1
0000033DATA 1,1,1,1,1,1,1,1,1,1,1,1
0000034
0000035FOR I=0 TO 11
0000036  FOR J=0 TO 11
0000037    BGPUT 0,J,I,CHIP[MAP[J,I]]
0000038  NEXT
0000039NEXT
0000040
0000041SPSET 0,600
0000042SPOFS 0,X*16,Y*16
0000043
0000044WHILE TRUE
0000045  B=BUTTON(0)
0000046  
0000047  'QUIT
0000048  IF B AND 64 THEN BREAK
0000049  
0000050  'UP MOVE
0000051  IF B AND 1 THEN
0000052    IF MAP[X,Y-1]==2 THEN
0000053      DEC Y
0000054      SPANIM 0,"I",8,609,8,610,8,611,8,608,1
0000055      SPANIM 0,"XY",-32,X*16,Y*16,1
0000056      WAIT 10
0000057    ENDIF
0000058  ENDIF
0000059  
0000060  'DOWN MOVE
0000061  IF B AND 2 THEN
0000062    IF MAP[X,Y+1]==2 THEN
0000063      INC Y
0000064      SPANIM 0,"I",8,601,8,602,8,603,8,600,1
0000065      SPANIM 0,"XY",-32,X*16,Y*16,1
0000066      WAIT 10
0000067    ENDIF
0000068  ENDIF
0000069  
0000070  'LEFT MOVE
0000071  IF B AND 4 THEN
0000072    IF MAP[X-1,Y]==2 THEN
0000073      DEC X
0000074      SPANIM 0,"I",8,605,8,606,8,607,8,604,1
0000075      SPANIM 0,"XY",-32,X*16,Y*16,1
0000076      WAIT 10
0000077    ENDIF
0000078  ENDIF
0000079  
0000080  'RIGHT MOVE
0000081  IF B AND 8 THEN
0000082    IF MAP[X+1,Y]==2 THEN
0000083      INC X
0000084      SPANIM 0,"I",8,597,8,598,8,599,8,596,1
0000085      SPANIM 0,"XY",-32,X*16,Y*16,1
0000086      WAIT 10
0000087    ENDIF
0000088  ENDIF
0000089  
0000090  VSYNC 1
0000091WEND
0000092ACLS:END

プログラムの説明

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



BGGET関数の利用

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

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

0000001OPTION STRICT
0000002ACLS
0000003DIM I,J,N,B,X=1,Y=1
0000004DIM CHIP[3]
0000005DIM MAP[12,12]
0000006
0000007BGSCREEN 0,12,12
0000008RESTORE @CHIPDATA
0000009FOR I=0 TO 2
0000010  READ CHIP[I]
0000011NEXT
0000012RESTORE @MAPDATA
0000013FOR I=0 TO 11
0000014  FOR J=0 TO 11
0000015    READ N
0000016    BGPUT 0,J,I,CHIP[N]
0000017  NEXT
0000018NEXT
0000019
0000020@CHIPDATA
0000021DATA 0,101,97
0000022@MAPDATA
0000023DATA 1,1,1,1,1,1,1,1,1,1,1,1
0000024DATA 1.2.1.2.2.2.1.2.2.2.2.1
0000025DATA 1,2,1,2,1,2,1,2,1,1,2,1
0000026DATA 1,2,1,2,1,2,1,2,1,2,2,1
0000027DATA 1,2,2,2,1,2,1,2,1,2,1,1
0000028DATA 1,1,1,1,1,2,1,2,1,2,2,1
0000029DATA 1,2,2,2,2,2,1,2,1,1,2,1
0000030DATA 1,2,1,1,1,1,1,2,1,2,2,1
0000031DATA 1,2,2,2,2,2,2,2,1,2,1,1
0000032DATA 1,2,1,1,1,1,1,1,1,2,1,1
0000033DATA 1,2,2,2,2,2,2,2,2,2,1,1
0000034DATA 1,1,1,1,1,1,1,1,1,1,1,1
0000035
0000036SPSET 0,600
0000037SPOFS 0,X*16,Y*16
0000038
0000039WHILE TRUE
0000040  B=BUTTON(0)
0000041  
0000042  'QUIT
0000043  IF B AND 64 THEN BREAK
0000044  
0000045  'UP MOVE
0000046  IF B AND 1 THEN
0000047    IF BGGET(0,X,Y-1)==97 THEN
0000048      DEC Y
0000049      SPANIM 0,"I",8,609,8,610,8,611,8,608,1
0000050      SPANIM 0,"XY",-32,X*16,Y*16,1
0000051      WAIT 10
0000052    ENDIF
0000053  ENDIF
0000054  
0000055  'DOWN MOVE
0000056  IF B AND 2 THEN
0000057    IF BGGET(0,X,Y+1)==97 THEN
0000058      INC Y
0000059      SPANIM 0,"I",8,601,8,602,8,603,8,600,1
0000060      SPANIM 0,"XY",-32,X*16,Y*16,1
0000061      WAIT 10
0000062    ENDIF
0000063  ENDIF
0000064  
0000065  'LEFT MOVE
0000066  IF B AND 4 THEN
0000067    IF BGGET(0,X-1,Y)==97 THEN
0000068      DEC X
0000069      SPANIM 0,"I",8,605,8,606,8,607,8,604,1
0000070      SPANIM 0,"XY",-32,X*16,Y*16,1
0000071      WAIT 10
0000072    ENDIF
0000073  ENDIF
0000074  
0000075  'RIGHT MOVE
0000076  IF B AND 8 THEN
0000077    IF BGGET(0,X+1,Y)==97 THEN
0000078      INC X
0000079      SPANIM 0,"I",8,597,8,598,8,599,8,596,1
0000080      SPANIM 0,"XY",-32,X*16,Y*16,1
0000081      WAIT 10
0000082    ENDIF
0000083  ENDIF
0000084  
0000085  VSYNC 1
0000086WEND
0000087ACLS:END




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

Copyright © King of Squid, All rights reserved.