RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 033回
タイトル画面を作る


kouza033 jarファイル



[タイトル画面を作る]
ありものをコピペしただけなので作った実感がないが、出来る限り説明を入れて行く。
この処理を作るために結構大きくハサミを入れたので部分的に大分変更した。
新規作成したのはTitlePartクラス。
まずは大元のARPanelから修正場所を見ていく。

[ARPanelクラス]
public ARPanel() {

super();
try{
graOff=true; //あとで使う。 //中略
timerThis.scheduleAtFixedRate(new TimerActionListener(), 1000l, 8l);
collision=new Collision();
gameMode=0;
evExe=new EventExecution();
//↓↓ここから先が変更部分↓↓
gData.pPlatform.keyCheck(keyPressTbl);
evExe.dataSet2(gData);

//強制的にタイトル画面を呼び出すイベントを起こす
gameMode=1;
evExe.staticEventDataSet(2);
//↑↑変更部分ここまで↑↑
} catch(Exception ex){
ex.printStackTrace();
JOptionPane.showMessageDialog(this, "ERROR : " + ex.toString());
}


} // end ARPanel

データ設定が終わったらマップ移動モードに移らず、タイトル画面を呼び出すイベントを起動させる。
eveExeを見る前にARPanelの描画方法を少しいじったのでそこを書いておく。

//--------------------------------------------------------------
//Paint処理
//--------------------------------------------------------------
public void paint(Graphics g){

g.setColor(Color.black);
g.fillRect(0, 0, 800, 800);
gData.gSet(g);
//gData.g=g;
//プレイヤーよりも奥に描画したいので、まずマップチップを描画する。
if (graOff==false) {
maptipPaint(g);
//オブジェの描画 プレイヤーもここで描く。
objPaint(g);
}
if (gameMode==1) {
evExe.gdtSet(gData);
evExe.paint(g);
}


} // end paint

変更点は一か所。graOffというグローバル変数を用意し、それがfalseの時はマップとオブジェの描画をしない。
graOffはARPanelのコンストラクタでtrueにしている。通常はfalseのまま。
なぜこの処理がいるのかというと、タイトル画面にマップとオブジェの絵が出てしまうから。
それは黒バックに文字だけにしたいので、タイトル画面表示中は余計なものを一時消去する。
しかし、ずっとこのままではゲームにならないので、ちょうどいいタイミングで解除する必要がある。

public void run(){

if(time % 2 == 0){
//中略
//イベント駆動モード イベントが終わるまでマップ移動モードに戻らない
if (gameMode==1) {
evExe.eventRoop();
if (evExe.eventEndFlag) {
//System.out.print("event終了----");
evExe.eventEndFlag=false;
gData.gameMode=0;
gameMode=0;
graOff=false; //←ここでgraOffを解除する。
}
}
} else {
repaint();
}


}

イベントモードを抜けるタイミングでgraOffを解除している。
タイトル画面イベント終了時に描画が通常の状態になる。
graOffはARPanelからしか干渉できないが、ほとんどタイトル画面専用処理なので今の所これでいい。
ではTitlePartクラスをまるごとコピペして見ていく。

[TitlePartクラス]
import java.awt.Graphics;

public class TitlePart {

public boolean titlePartEnd=false;
public boolean dataLoadFlag=false;
public Graphics g;
private GameData gData=null;
public int[][] cursorPos=null;
public int mode=0;
public DataSaveLoad dataSL=null;
private GraphicSet gSet=null;

public TitlePart() {
init();
}

public void init() {
gData=new GameData();
cursorPos=new int[3][3];
mode=0;
titlePartEnd=false;
dataLoadFlag=false;
for (int i=0;i<=2;i++) {
for (int j=0;j<=2;j++) {

cursorPos[j][i]=0;
}
}
cursorPos[0][0]=1; //ロードにカーソルを合わせて始める。
cursorPos[0][1]=1;
cursorPos[1][1]=5;
dataSL=new DataSaveLoad();
gSet=new GraphicSet();
}

public void dataSet(GameData gdt) {
init();
gData=gdt;
}

public void graPaint(Graphics gr) {
g=gr;
String[] word= {"[START]","[LOAD]"};
int stx=300;
int sty=400;
gSet.rectSet2(gr,stx,sty,150,80,0,0);
for (int i=0;i<=word.length-1;i++) {
gSet.wordDisp_short(gr,word[i],stx+22,sty+22+i*22);
}
gSet.wordDisp_short(gr,"→",stx,sty+22+cursorPos[0][0]*22);
gSet.wordDisp_short3(gr,"RPG01 (TEST)",100,200,0,60);
if (mode==1) {
String[] moji= {"FILE0","FILE1","FILE2","FILE3","FILE4"};
gSet.rectSet2(gr,stx+150,sty,144,120,0,220);
for (int i=0;i<=moji.length-1;i++) {
gSet.wordDisp_short(gr,moji[i],stx+150+22,sty+22+i*22);
}
gSet.wordDisp_short(gr,"→",stx+150,sty+22+cursorPos[1][0]*22);
}
}

public void eventStart(GameData gdt) {
//PlayerPlatform pPlatform=gdt.pPlatform;
int pushKey=0;
int modeChange=999;
gData=gdt;
if (gData.pPlatform.keyPush[4]) { //space
gData.pPlatform.keyPush[4]=false;
pushKey=1;
}
if (gData.pPlatform.keyPush[5]) { //d
gData.pPlatform.keyPush[5]=false;
pushKey=2;
}
if (gData.pPlatform.keyPush[0]) { //up
gData.pPlatform.keyPush[0]=false;
cursorPos[mode][0]--;
}
if (gData.pPlatform.keyPush[1]) { //down
gData.pPlatform.keyPush[1]=false;
cursorPos[mode][0]++;
}

if (pushKey==1) {
if (mode==0) {
int cp=cursorPos[0][0];
if (cp==0) {//はじめからスタート
titlePartEnd=true;
}

if (cp==1) {//ロード
modeChange=1;
}
}
//ロードするファイルを選ぶモード
if (mode==1) {
int cp=cursorPos[1][0];
dataLoad();
}
}
if (pushKey==2) {
if (mode==1) {
modeChange=0;
}
}

if (modeChange<=10) {
mode=modeChange;
}
if (cursorPos[mode][0] > cursorPos[mode][1]) cursorPos[mode][0]=0;
if (cursorPos[mode][0] < 0) cursorPos[mode][0]=cursorPos[mode][1];
}

public void dataLoad() {
int fileNum=cursorPos[1][0];
dataSL.dataLoad(fileNum,gData);
//ロード後はタイトルパートを終了する。
dataLoadFlag=true;
titlePartEnd=true;
}


}

それほど複雑な処理はしていないのでほとんど解説することが無いけど…。
キー入力はpPlatformを流用するのは毎度のパターン。
文字や四角の描画はgraSetクラスを使う。
使いまわせる部分はリサイクルしまくる。
一度成功しているのでエラーになる率が低く、使い方が共通しているので使いやすい。
本当はクラス内部で完結する形にするのが正しいやり方だろうけど、楽な方を優先する。

スタートを選んだら何もせずに移動モードに入る。
ロードを選んだら場所移動イベントをかませる。
この使い分けはdataLoadFlagがtrueかどうかをイベント終了時に調べる。
最後にEventExecutionクラスでtitlePartを抜けたときの処理を見る。

public void titlePartStart () {

tiPart.eventStart(gData);
//ここら辺の処理はステータスウィンドウ抜ける時の使いまわし。全く同じ処理だ。
if (tiPart.titlePartEnd) {
if (tiPart.dataLoadFlag) {
//int[] data=new int[7];
int[] pxy=gData.pPlatform.getxy();
int[] data= {0,0,gData.mapNumber[0],gData.mapNumber[1],pxy[0]/32,pxy[1]/32,pxy[2]};
//↓ここから先は使わない。上の一行を分けて書くとこうなる。
/*data[0]=0;
data[1]=0;
data[2]=gData.mapNumber[0];
data[3]=gData.mapNumber[1];
data[4]=pxy[0]/32; //実座標で入っているので、32区切りに変換する。
data[5]=pxy[1]/32;
data[6]=pxy[2];*/
//↑ここまで使わない。一行にまとめられるので。
//あとは通常のマップ移動イベントを利用。
mapChangeSet(data);
//int[] kdt= {0,0,2,0,11,10,8};
//System.out.println("gp mapNumber="+gp[2]+","+gp[3]+" x y="+gp[4]+","+gp[5]+" shift="+gp[6]);
} else {
int[] data= {0,2,0,0,0,0,0};
mapChangeSet(data);
//phasePlus++;

}
}


}

データロードして抜けた場合は読み込んだgDataを元に移動先を決定する。
スタートを選らんだ場合も場所移動イベントをかませている。
スタート地点をデバッグ用のマップではなく拠点にした。
本来はデバッグ用のマップにいっちゃいけないので…。
拠点でもそこへの移動イベントは最終的に削除する。
本来イベントクリアまで外に出られない。

ほとんど完成しているが、肝心の処理を入れてなかった。。
次は効果音をつける。BGMは無しにするが、効果音があった方がゲームっぽくなる。
あと、カーソルを動かしたというレスポンスも兼ねるので、
視覚以外で動きを体感できるという重要な役割がある。

ということで次回は「効果音を入れる」で行きます。


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