MAGI JAVA -Make a game in Java-
JAVA Game作成講座 004回 クラスに処理を分担する 1


kouza004 jarファイル


まだ移行の途中ですが、何やってるのか分からなくなるので一度解説を入れます。
さらにクラスを一個増やしました。


増やしたクラスは、「 GraphicSet 」クラス。
BufferedImage を作成し、画像を入力、出来た画像を戻すだけのクラスです。
ARPanelでやっていた処理をこちらに移行させました。
今後ARPanelから画像を読み込むことはありません。

public class GraphicSet extends JFrame {
//ここがポイント。JFrameを継承させたクラスじゃないと絵(BufferedImage)を使えません。
//通常のクラスでやるとエラーが出ます。


public GraphicSet() {

}

public BufferedImage mapUnitGraSet(int num) {
BufferedImage gra=null;
String fileName="";
try {
if (num<=1) {
fileName="mapUnit1.gif";//いちいちinputStream…のくだりを書かなくてもいいように、
gra=gSet(fileName);//ファイル名だけ関数に放り込んだら結果を戻すように作り替える。
}
}catch(Exception ex){
ex.printStackTrace();
JOptionPane.showMessageDialog(this, "ERROR : " + ex.toString());
}
return gra;
}

public BufferedImage gSet(String fileName) throws IOException {//ファイル名を受け取ったら
InputStream isbufImg=this.getClass().getResourceAsStream(fileName);//それを読み込む関数。
BufferedImage bufImg=ImageIO.read(isbufImg);
isbufImg.close();
return bufImg;
}

}


将来的にあらゆる画像をここから引っ張ってくるので、
ナンバーを入力するとそれに対応した画像をロードさせます。
後々の手間を省くためにgSetなどに処理を分担しています。

[PlayerPlatformクラス]
public class PlayerPlatform {

private int shift=0;
private int speedMax=8;
private boolean[] keyPressTbl=null;
//速度
private double vx=0;
private double vy=0;
//実座標
private double x=0;
private double y=0;

private int[] mapSize=null;
public BufferedImage gra=null;
public GraphicSet gSet=null;

public PlayerPlatform() {
init();
}


public void init() {
x=0;
y=0;
vx=0;
vy=0;
shift=0;
mapSize=new int[3];
mapSize[0]=800;
mapSize[1]=608;
mapSize[0]=0;v gSet=new GraphicSet();
}

public void graSet() {//ARPanelから呼び出し。pPlatformのgraにプレイヤーの絵をセットする。
gra=gSet.mapUnitGraSet(0);//今後、プレイヤー絵の描画はpPlatform.graを使って表示する。
}

//プレイヤーの絵の座標を決める。ARPanelから入力
public void setXY(int stx,int sty) {
x=stx;
y=sty;
}

//マップサイズを入力。これがないと画面端を計算できない。
public void setMapSize(int stx,int sty) {
mapSize[0]=stx;
mapSize[1]=sty;
}
//ここら辺の処理はARPanelのものをそのまま移行した物が大半。
mx,myという変数名はvx,vyに変更した。

public void keyCheck(boolean[] kPTbl) {
keyPressTbl=kPTbl;
//keyCheckはARPanelから利用される。
//その際にARPanelで拾ったキーボードの状態を引数として渡して置く事。
//これをやらないとキーを押しても全く反映されなくなる。
if(isKeyCodePressed(KeyEvent.VK_UP)){
shift=8;
vy--;
}
if(isKeyCodePressed(KeyEvent.VK_DOWN)){
shift=2;
vy++;
}
v if(isKeyCodePressed(KeyEvent.VK_LEFT)){
shift=4;
vx--;
}
if(isKeyCodePressed(KeyEvent.VK_RIGHT)){
shift=6;
vx++;
}
}
//現時点ではmove関数は使っていない。
//次の段階でこっちの数値を拾って描画に反映させる。
public void move(GameData gData) {
x = x + vx;
y +=vy;

if(x < 0){
x = 0;
vx = 0;


//マップサイズからはみ出てないかチェック。
//ARPanelの時は this.getWidth() を使っていたが、
//こちらのクラスではあらかじめマップサイズを渡しておき、それを参照する。

}else if(x > mapSize[0] - 32){
x = mapSize[0] - 32;
vx = 0;
}

if (y < 0) {
y=0;
vy=0;
} else if (y > mapSize[1]-32){v y= mapSize[1]-32;
vy=0;
}

}
//----------------------------------------------------------
// キー押してるかチェック
//----------------------------------------------------------
//これもそのまま移行しただけ。
public boolean isKeyCodePressed (int keyCode) {
return keyPressTbl[keyCode];
} //end is KeyCodePressed
}

[ARPanelの変更点]
(79行目あたり)
//InputStreamやっていたところにこれを使う。
gData.pPlatform.graSet(0);//pPlatform.graを指定ナンバーのグラフィックにする処理。
gData.pPlatform.setXY(384,500);//pPlatform内のx,yを指定の数値に置き換える。
gData.pPlatform.setMapSize(800,608);//pPlatformが認識するマップの縦横サイズを入力。

プレイヤーの絵を差し替える事が容易になった。
番号を変えれば違う絵のキャラをプレイヤーにできる。

(186行目)
//g.drawImage(playerGra,x,y-16,x+picSize,y+picSize,sx,sy,sx+picSize,sy+picSize+16,this);
g.drawImage(gData.pPlatform.gra,x,y-16,x+picSize,y+picSize,sx,sy,sx+picSize,sy+picSize+16,this);

プレイヤーの絵を描くときにARPanelのplayerGraをつかっていたが、
それをgData.pPlatform.graに移行している。
座標などはまだARPanelに依存しているが、絵の表示方法は別クラスに独立させた。
他にも細かく手を加えたが、次のステップで座標の取得を移行させてから
ARPanelの要らない部分を削った後に解説を入れる予定。

地味に敬語じゃなくなっているが、ですます体で書くのが面倒になってきた。

いきなりガシガシ改変しているが、
まだ処理の大半はARPanelに依存している。
これをpPlatformで行う形に変更していく。


次は座標の取得をpPlatform側から行う処理に切り替える。
同時にプレイヤーの移動制御もそっちのクラスで行う。
移行完了したらARPanelの無駄な部分を削る。

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