MAGI JAVA -Make a game in Java-
JAVA Game作成講座 009回
マップをスクロールさせる


kouza009 jarファイル



[今回追加したもの]
・GameDataクラスにカメラ関連の変数と関数を用意
・合わせて他の部分も微妙にいじった


[GameDataクラスの変更点]

public int[] cameraPos=new int[3];


[init関数]
for (int i=0;i<=2;i++) {
cameraPos[i]=0;
}

念のため初期化する。
実際に使うのはx [0],y [1]だけだが、慣習として1要素余分に用意する。


public void setMapSize(int x, int y) {

if (x<=MAP_WIDTH_MIN/32) x=MAP_WIDTH_MIN/32;
if (y<=MAP_HEIGHT_MIN/32) x=MAP_HEIGHT_MIN/32;
mapSize[0]=x;
mapSize[1]=y;
//同時にプレイヤー制御クラスのマップサイズも変更しておく。
pPlatform.setMapSize(mapSize[0]*32, mapSize[1]*32);

}

マップサイズを変更する関数。
チップ単位の数値を引数として入れ、mapSize[0],[1]に格納する。
同時にpPlatformのマップサイズも修正。
こちらは実数値を使うので*32しておく。



今回のメイン処理。
ほとんどコメントで解説しているのであまり語る事は無い。

public void cameraSet(int delay) {

int[] gxy=pPlatform.getxy(); //プレイヤーのx, y 座標を抜く。
int px=gxy[0];
int py=gxy[1];

cameraPos[0]=px-400; //プレイヤーの斜め左上、mapWidthの半分がカメラをセットする位置になる。
cameraPos[1]=py-304; //同じくmapHeight/2

//最低でも一画面分は表示されるように微調整。
int mWidth=mapSize[0]*32;
int mHeight=mapSize[1]*32;
if (mWidth<=MAP_WIDTH_MIN) mWidth=MAP_WIDTH_MIN;
if (mHeight<=MAP_HEIGHT_MIN) mHeight=MAP_HEIGHT_MIN;

//画面端まで到達したらそれ以上スクロールしないようにロックする。
//それ以上行くとチップを敷いてない所まで見えてしまう。
//上限がxはmapWidth-800 yはmapWidth-608。1画面分の余裕が必要になる。
int maxPosX=mWidth-MAP_WIDTH_MIN;
int maxPosY=mHeight-MAP_HEIGHT_MIN;

if (cameraPos[0]<=0) cameraPos[0]=0;
if (cameraPos[0]>=maxPosX) cameraPos[0]=maxPosX;

if (cameraPos[1]<=0) cameraPos[1]=0;
if (cameraPos[1]>=maxPosY) cameraPos[1]=maxPosY;


}

[ARPanelクラスでカメラ制御を実行する]
[76行目あたり]
gData.pPlatform.graSet(0);
gData.pPlatform.setXY(384,500);
gData.setMapSize(50,40);

プレイヤーのマップサイズを直接を入力していたところを、
gDataを経由して修正する形に変えた。
gData内のマップサイズを変更しつつ、プレイヤーの物も同時に修正している。


public void run(){

time++;


if(time % 6 == 0){
gData.pPlatform.keyCheck(keyPressTbl);


} // end if


if(time % 2 == 0){
gData.pPlatform.move(gData);
gData.cameraSet(1);//←カメラセット関数を呼び出す。runの変更点はここだけ。
}else{
repaint();
}


} // end run


public void paint(Graphics g){

g.setColor(Color.black);
g.fillRect(0, 0, 800, 800);

//プレイヤーよりも奥に描画したいので、まずマップチップを描画する。
maptipPaint(g);//この内部も変更している。すぐ後で解説する。

//g.drawImage(imageShips[muki], x, y, 32, 40, this);
int picSize=32;
int oxy[]=gData.pPlatform.getxy();
//カメラによる座標修正を加える
oxy[0]-=gData.cameraPos[0];
oxy[1]-=gData.cameraPos[1];
以下略…

修正箇所はoxy[0], [1]をカメラの分だけマイナスしただけ。

public void maptipPaint(Graphics g)

//カメラによる修正値を加える
int zx=x*32-gData.cameraPos[0];
int zy=y*32-gData.cameraPos[1];

g.drawImage(gData.maptipGra,zx,zy,zx+32,zy+32,dx,dy,dx+32,dy+32,this);


これもプレイヤーの修正と同じ。チップを置く座標をカメラ分ずらす。



マイナスしたりプラスしたりとわかりにくいが、
数値を反転させたりカメラ座標を少しずらしたりすると効果が分かる。
今回はここまで。

次回はブロックを配置し、壁を作る。

1つ大きな変数を用意する。
今まで描画用のmaptipNumberしかなかったが、
ブロック用の変数を作り、それを元にブロックを配置。

Collisionというブロックとプレイヤーの
当たり判定を求めるクラスを用意する。
これはそのまま流用してほしい。
ActionScriptで使っていたクラスをそのままJAVAに流用したものだ。
当たり判定を計算するクラスで非常に便利。
意味も半分以下しか分からずに使っている…。

・トップページへ戻る
inserted by FC2 system