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

プチコン3号


参考資料

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

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

仮想スクリーンの利用

キャラクタ(スプライト)を1ドット(ピクセル)単位で移動させる場合、進める処、進めない処を判別するのに、2箇所のチェックが必要と成ります。

ドット座標よりグリッド座標を求めるには、グリッドの幅、高さで整数除算(DIV演算子)を行います。例えば、キャラクタが上に移動する時のコードは、下記の通りです。

  'UP MOVE
  IF B AND 1 THEN
    L=MAP[X DIV 16,(Y-1) DIV 16]
    R=MAP[(X+15) DIV 16,(Y-1) DIV 16]
    IF L==2 && R==2 THEN
      DEC Y:SPCHR 0,608+N
    ENDIF
  ENDIF

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

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

0000001OPTION STRICT
0000002ACLS
0000003DIM I,J,C,N,B,L,R,U,D,X=16,Y=16
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,Y
0000043
0000044C=0:N=0
0000045WHILE TRUE
0000046  B=BUTTON(0)
0000047  
0000048  'QUIT
0000049  IF B AND 64 THEN BREAK
0000050  
0000051  'UP MOVE
0000052  IF B AND 1 THEN
0000053    L=MAP[X DIV 16,(Y-1) DIV 16]
0000054    R=MAP[(X+15) DIV 16,(Y-1) DIV 16]
0000055    IF L==2 && R==2 THEN
0000056      DEC Y:SPCHR 0,608+N
0000057    ENDIF
0000058  ENDIF
0000059  
0000060  'DOWN MOVE
0000061  IF B AND 2 THEN
0000062    L=MAP[X DIV 16,(Y+16) DIV 16]
0000063    R=MAP[(X+15) DIV 16,(Y+16) DIV 16]
0000064    IF L==2 && R==2 THEN
0000065      INC Y:SPCHR 0,600+N
0000066    ENDIF
0000067  ENDIF
0000068  
0000069  'LEFT MOVE
0000070  IF B AND 4 THEN
0000071    U=MAP[(X-1) DIV 16,Y DIV 16]
0000072    D=MAP[(X-1) DIV 16,(Y+15) DIV 16]
0000073    IF U==2 && D==2 THEN
0000074      DEC X:SPCHR 0,604+N
0000075    ENDIF
0000076  ENDIF
0000077  
0000078  'RIGHT MOVE
0000079  IF B AND 8 THEN
0000080    U=MAP[(X+16) DIV 16,Y DIV 16]
0000081    D=MAP[(X+16) DIV 16,(Y+15) DIV 16]
0000082    IF U==2 && D==2 THEN
0000083      INC X:SPCHR 0,596+N
0000084    ENDIF
0000085  ENDIF
0000086  
0000087  'LOOP COUNTER
0000088  INC C
0000089  IF (C DIV 10)==1 THEN
0000090    C=0:INC N:IF N>3 THEN N=0
0000091  ENDIF
0000092  
0000093  SPOFS 0,X,Y
0000094  
0000095  VSYNC 1
0000096WEND
0000097ACLS:END

プログラムの説明

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



BGGET関数の利用

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

IF B AND 1 THEN
  L=BGGET(0,X,Y-1,1)
  R=BGGET(0,X+15,Y-1,1)
  IF L==97 && R==97 THEN
    DEC Y:SPCHR 0,608+N
  ENDIF
ENDIF

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

0000001OPTION STRICT
0000002ACLS
0000003DIM I,J,C,N,B,L,R,U,D,X=16,Y=16
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,Y
0000038
0000039C=0:N=0
0000040WHILE TRUE
0000041  B=BUTTON(0)
0000042  
0000043  'QUIT
0000044  IF B AND 64 THEN BREAK
0000045  
0000046  'UP MOVE
0000047  IF B AND 1 THEN
0000048    L=BGGET(0,X,Y-1,1)
0000049    R=BGGET(0,X+15,Y-1,1)
0000050    IF L==97 && R==97 THEN
0000051      DEC Y:SPCHR 0,608+N
0000052    ENDIF
0000053  ENDIF
0000054  
0000055  'DOWN MOVE
0000056  IF B AND 2 THEN
0000057    L=BGGET(0,X,Y+16,1)
0000058    R=BGGET(0,X+15,Y+16,1)
0000059    IF L==97 && R==97 THEN
0000060      INC Y:SPCHR 0,600+N
0000061    ENDIF
0000062  ENDIF
0000063  
0000064  'LEFT MOVE
0000065  IF B AND 4 THEN
0000066    U=BGGET(0,X-1,Y,1)
0000067    D=BGGET(0,X-1,Y+15,1)
0000068    IF L==97 && R==97 THEN
0000069      DEC X:SPCHR 0,604+N
0000070    ENDIF
0000071  ENDIF
0000072  
0000073  'RIGHT MOVE
0000074  IF B AND 8 THEN
0000075    U=BGGET(0,X+16,Y,1)
0000076    D=BGGET(0,X+16,Y+15,1)
0000077    IF L==97 && R==97 THEN
0000078      INC X:SPCHR 0,596+N
0000079    ENDIF
0000080  ENDIF
0000081  
0000082  'LOOP COUNTER
0000083  INC C
0000084  IF (C DIV 10)==1 THEN
0000085    C=0:INC N:IF N>3 THEN N=0
0000086  ENDIF
0000087  
0000088  SPOFS 0,X,Y
0000089  
0000090  VSYNC 1
0000091WEND
0000092ACLS:END




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

Copyright © King of Squid, All rights reserved.