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
008 膨大なマップをドットスクロール 2010/05/12(Wed) 23:25
データはこちら(ZIP形式)

せっかくの膨大なマップも
チップ単位でのスクロールは動きもカクカクですし、
なんだか20年前のパソゲーみたいです(^^;
ってなわけで今回は滑らかなドット単位でのスクロールです。
ではではソース行きます。


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*8
IF V<0 THEN V=6400+V ENDIF
IF V>6399 THEN V=V-6400 ENDIF
W=W+STCY*8
IF W<0 THEN W=4800+W ENDIF
IF W>4799 THEN W=W-4800 ENDIF

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

FOR Y=0 TO 15
FOR X=0 TO 20

MAPX=X+V/32
IF MAPX<0 THEN MAPX=200+MAPX ENDIF
IF MAPX>199 THEN MAPX=MAPX-200 ENDIF
MAPY=Y+W/32
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-V%32,Y*32-W%32,0,0)
G@CHRCOPYF(CH1,CH0,0)

NEXT
NEXT

G@FLIP()
ENDLOOP


今回はマップをドット単位でスクロールさせるため、
前回のプログラムにちょっと手を加えています。

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

V=V+STCX*8
IF V<0 THEN V=6400+V ENDIF
IF V>6399 THEN V=V-6400 ENDIF
W=W+STCY*8
IF W<0 THEN W=4800+W ENDIF
IF W>4799 THEN W=W-4800 ENDIF

前回はチップ単位でのリミット処理でしたが、
今回はマップ全体をドットという概念で扱っています。


FOR Y=0 TO 15
FOR X=0 TO 20

MAPX=X+V/32
IF MAPX<0 THEN MAPX=200+MAPX ENDIF
IF MAPX>199 THEN MAPX=MAPX-200 ENDIF
MAPY=Y+W/32
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-V%32,Y*32-W%32,0,0)
G@CHRCOPYF(CH1,CH0,0)

NEXT
NEXT

画像表示に関してはチップ単位ですので、
まずドットで表した座標をチップの座標に変換します。
チップが32ドットの為、座標/32です。

んで、
G@CHRRECT(CH0,X*32-V%32,Y*32-W%32,0,0)
ここの箇所。
V%32やW%32は”VやWを32で割った余りの値”という意味です。
全体の画面をドット単位で動かす為
チップのドット数より小さい数値を取得し、
各チップの表示座標に足しているわけです。

元々の1画面分の画像をドットで動かすと、その領域外は当然何も表示されないので
このソースの場合、画面右端と下にちらつきが生じます。

対策として、もう1チップ分範囲を広くして描画処理をおこなっています。
(この場合右端の縦1列と一番下の横1列)


ざっと解説しましたが、
実際にソースをいじったりして理解を得たほうが
よりわかり易いと思います。
(不正処理で止めない程度に計画的なご利用を…(^^;))