LGP3講座
LGP3に関する基礎知識からちょっとした小技、
使用している周辺ツールの紹介なんかも
やっていけたらと思います


TOPへ戻る

001 その1 LGP3とは?
002 その2 LGP3に必要なもの
003 その3 2D画像の表示
004 その4 キャラをコントローラで動かす
005 その5 マップチップ表示
006 番外編1 膨大なマップデータ
007 その6 膨大なマップデータの表示
008 膨大なマップをドットスクロール
009 番外編2マップ表示応用編
010 番外編3 フレームスキップ
011 番外編4 応用、モザイク処理
012 番外編5 スプライン、ベジェ
013 番外編6 ラスタースクロール
014 サンプル1 スーパーマリオみたいな挙動

- MultiView (Version 3.4) -

admin mode new input logout
007 その6 膨大なマップデータの表示 2010/05/11(Tue) 22:20
データはこちら(ZIP形式)

データが大きくなりましたので圧縮ファイルでアップしました(^^;

CH0=G@SETUP(640,480,16,1)
CH1=G@CHRLOAD("mapchip.bmp")

DIM MAP(200,150)

FN=F@OPEN("MAPDATA1.DAT",0,1)
FOR W=0 TO 149
FOR V=0 TO 199
DAT=F@READ(FN);MAP(V,W)=DAT
NEXT
NEXT
F@CLOSE(FN)

V=0;W=0

LOOP
G@CHRCLEAR(CH0)

I@KEYGET()
STCY=I@KEYBTN(0XD0)-I@KEYBTN(0XC8)
STCX=I@KEYBTN(0XCD)-I@KEYBTN(0XCB)

V=V+STCX
IF V<0 THEN V=200+V ENDIF
IF V>199 THEN V=V-200 ENDIF
W=W+STCY
IF W<0 THEN W=150+W ENDIF
IF W>149 THEN W=W-150 ENDIF

//ウェイト
FPS=30
NOWTIME=SYSTIME()
WHILE (NOWTIME-GET_SYSTEMTIMER)<(1000/FPS)
NOWTIME=SYSTIME()
ENDWHILE
GET_SYSTEMTIMER=SYSTIME()

FOR Y=0 TO 14
FOR X=0 TO 19

MAPX=X+V
IF MAPX<0 THEN MAPX=200+MAPX ENDIF
IF MAPX>199 THEN MAPX=MAPX-200 ENDIF
MAPY=Y+W
IF MAPY<0 THEN MAPY=150+MAPY ENDIF
IF MAPY>149 THEN MAPY=MAPY-150 ENDIF

G@CHRRECT(CH1,MAP(MAPX,MAPY)*32,0,MAP(MAPX,MAPY)*32+31,31)
G@CHRRECT(CH0,X*32,Y*32,0,0)
G@CHRCOPYF(CH1,CH0,0)

NEXT
NEXT

G@FLIP()
ENDLOOP

10×10画面分のマップ表示プログラムです。

カーソルキーで全方位チップ毎スクロールを行います。
ではでは要所解説をば…


I@KEYGET()
STCY=I@KEYBTN(0XD0)-I@KEYBTN(0XC8)
STCX=I@KEYBTN(0XCD)-I@KEYBTN(0XCB)

V=V+STCX
IF V<0 THEN V=200+V ENDIF
IF V>199 THEN V=V-200 ENDIF
W=W+STCY
IF W<0 THEN W=150+W ENDIF
IF W>149 THEN W=W-150 ENDIF

まずキーの入力情報を取得し、
それに伴い現在地に加減算していきます。
それぞれの座標で、最小値と最大値を超えないように処理をします。
(この場合は両端を繋げる”巻物スクロール”と言う形をとっています)


FOR Y=0 TO 14
FOR X=0 TO 19

MAPX=X+V
IF MAPX<0 THEN MAPX=200+MAPX ENDIF
IF MAPX>199 THEN MAPX=MAPX-200 ENDIF
MAPY=Y+W
IF MAPY<0 THEN MAPY=150+MAPY ENDIF
IF MAPY>149 THEN MAPY=MAPY-150 ENDIF

G@CHRRECT(CH1,MAP(MAPX,MAPY)*32,0,MAP(MAPX,MAPY)*32+31,31)
G@CHRRECT(CH0,X*32,Y*32,0,0)
G@CHRCOPYF(CH1,CH0,0)

NEXT
NEXT

ここでマップチップを表示させます。
ここでのIF〜THEN文ですが、
一見先ほどの座標リミット処理と同じようですが、
ここでは配列変数で定義された範囲を超えないための処理です。


ここでひとつ疑問、
キー入力や座標の判定処理と画像表示処理の間に
同期を取るウェイト処理を入れてます。
この場所に入れるのが非常に重要なんです。
それはまた番外編でやろうと思います。