RPG01

MAGI JAVA -Make a game in Java-
JAVA Game作成講座 022回
ショップを作る 2 武器屋


kouza022 jarファイル



[武器屋を作成]
・アイテムの購入
・アイテムの売却
を作成した。
道具屋などは次回追加する。
あまり一気につくってもごちゃごちゃするので。
ついでにここで使った処理をステータス画面に応用した。
ほとんど前作で使った処理を流用している。

[ShopPartクラス]
eventStart関数から一部抜粋する。
} else { //武器屋、防具屋、装具屋、アイテム屋は全て共通の流れになる。

if (mode==1) {//総合メニュー
if (pushKey==1) {
if (cpos==0) modeChange=2;
if (cpos==1) modeChange=3;
if (cpos==2) shopEnd=true;
}
if (pushKey==2) shopEnd=true;
}
if (mode==2) { //買う モード
if (pushKey==1) {
ItemData bitem=siData[cpos];
Boolean notbuy=false;
if (bitem.category==0) {
notbuy=true;
infoSet("何もない!","");
}
if (bitem.price>gData.money) {
notbuy=true;
infoSet("お金が足りない!","");
}
if (notbuy==false) {
//int price=bitem.price;
//作ったデータをアイテムリストに反映させる。
Boolean itemGet=false;
int itemMax=199;
//カテゴリー5のアイテムは1枠に複数所持できる。まずはそのチェック。
int sameItemNumber=9999;
boolean same=false;
if (bitem.category==5) {
sameItemNumber=idSet.sameCheck(gData.siData,bitem.itemNumber);
if (sameItemNumber<=itemMax) {
gData.siData[sameItemNumber].quantity++;
same=true;
itemGet=true;
}
}
//カテゴリー5ではないorすでに一枠に20以上持っていた場合、空欄チェックに入る。
if (same==false) {
//まずはアイテムリストの空きチェック。そこに新しく手に入れたアイテムを挿入する。
int blankNumber=idSet.blankCheck(gData.siData);
System.out.println("num="+blankNumber);
if (blankNumber<=itemMax) {
//gData.iData[blankNumber]=sellItemData[num];
idSet.dataCopy(gData.siData[blankNumber], bitem);
gData.siData[blankNumber].quantity=1;
itemGet=true;
}
}

if (itemGet==true) {
if (gData.money>=bitem.price) gData.money-=bitem.price;
infoSet("「"+bitem.name+"」","を買いました");
}

}
}
if (pushKey==2) modeChange=1;
}
if (mode==3) { //売る モード
if (pushKey==1) {
int num=cpos;
if(gData.siData[num].category>=1) {
int sellPrice=gData.siData[num].price/2;
//消費アイテムは1枠に複数個持てるので、一個ずつ売ることになる。
//まとめ売りにしてもいいが、うっかり全部売りかねないので…。
//まとめ売りは別処理で作るべきかもしれん。
infoSet("「"+gData.siData[num].name+"」","を売りました");
if (gData.siData[num].category==4) {
gData.siData[num].quantity--;
if (gData.siData[num].quantity<=0) gData.siData[num].init();
} else {
gData.siData[num].init();
}
gData.money+=sellPrice;

} else {
infoSet("何もないよ!","");
}
}
if (pushKey==2) modeChange=1;
}




infoSet関数は前回作ったもの。
public void infoSet(String str1,String str2) {

infoDisp=true;
infoTimer=30;
infoWord=str1;
infoWord2=str2;


}
中略…

if (infoTimer>=1) {

infoTimer--;
if (infoTimer==0) infoDisp=false;


}

タイマーをセットし、文字を二行分読み込ませる。
タイマーが1以上ある時のみ、小さめのウィンドウを表示する。
タイマーは上記の通り毎ループごとにカウンターを1ずつ減らす。
0になったら表示命令をオフにする。
dispがtrueであり、timerが>=1の時だけ描画するように命令を作っている。

[買う処理]
カーソルのあった場所の商品を買い物と仮定し、
所持金が足りており、カーソルの場所が空欄で無い場合のみアイテムを購入できる。
アイテム欄の空きを探し、そこにアイテムをセットする。
空きが無い場合の処理を作ってないので、それも次回追加しておこう。
200個もアイテムを持つことは無いと思うけど…。

[売る処理]
カテゴリーが4の時だけ処理が少し異なる。
1枠に複数個のアイテムを確保するため、リストから消すときは個数(Quantity)が0になった時のみ。
Quantityが1以上ある時はその数値を減らしてお金に変える。
売りますか? はい/いいえ の過程をすっ飛ばして速攻処分するので、
スピード感はあるけど間違えて売った時に救済処置が無い。

描画については…説明を省略する。
大して珍しい事やってないので見ればわかると思う。
アイテム売るモードの描画は
StatusWindowクラスのアイテム表示命令をそのまま流用している。
リサイクルできる部分はとことん使い回すのがポイント。
何故かというと、一度成功しているから。
移植しやすい形で作っておくと他のクラスでもコピペですぐ使える。


次回は防具屋、装具屋、アイテム屋を作る。
それに加えてセーブ、ロードも追加する予定。



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