アイテム購入処理+村メニュー実装

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

アイテム購入処理+村メニュー実装

投稿記事 by Tatu » 14年前

1.アイテム購入処理

前回の続きです。

その品物を買ったかどうか,装備したかどうかの変数を用意します。

mura.cppに以下を追加

CODE:

//アイテムの状態
//買っていなかったら0
//買ったら1
//装備していたら2
char item_state[3][23];
決定キーを押したとき、買っていなく、お金が値段以上ならば
お金を減らし、対応する変数を1にする。
mura.cppのgraph_shop()に以下を追加

CODE:

	//品物を買う
	if(CheckStatePad(configpad.shot)==1){
		//購入条件を満たしていたら
		if(item_state[shop_knd][shop_select]==0 && shop_price[shop_knd][shop_select]>0 && ch.money>=shop_price[shop_knd][shop_select]){
			item_state[shop_knd][shop_select]=1;
			ch.money-=shop_price[shop_knd][shop_select];
		}
	}

CODE:

	//所持金表示
	DrawStringToHandle(400,0,"所持金",color[0],font[0]);
	DrawFormatStringToHandle(480,0,color[0],font[0],"%d",ch.money);

2.村メニュー

店の処理ができたので今度はアイテムを装備するため、メニューを実装します。

止まっているときにESCキーを押すとメニューが出るようにします。

以下を変更。

CODE:

enum{
WALK,
TALK,
SHOP,
MENU,
}mura_state;
mura.cppのm_ch_move()に以下を追加

CODE:

		//メニューを開く
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1){
			mura_state=MENU;
			return;
		}

CODE:

//村メニューの状態を表す変数
enum{
FIRST,
ITEM,
//STATUS
}mura_menu_state;

//村メニューでの選択
int mura_menu_command;

//装備アイテムの場所
char *(equip_item[12])={
	&item_state[0][0],
	&item_state[0][2],
	&item_state[0][4],
	&item_state[0][6],
	&item_state[0][8],
	&item_state[1][2],
	&item_state[0][1],
	&item_state[0][3],
	&item_state[0][5],
	&item_state[0][7],
	&item_state[0][9],
	&item_state[1][1],
};

CODE:

void control_mura_menu(){
	switch(mura_menu_state){
	case FIRST:
		if(CheckStatePad(configpad.down)==1){
			mura_menu_command++;
			if(mura_menu_command>3){
				mura_menu_command=0;
			}
		}
		if(CheckStatePad(configpad.up)==1){
			mura_menu_command--;
			if(mura_menu_command<0){
				mura_menu_command=3;
			}
		}
		if(CheckStatePad(configpad.bom)==1){
			mura_menu_command=0;
			mura_state=WALK;
		}
		if(CheckStatePad(configpad.shot)==1){
			switch(mura_menu_command){
			case 0://装備を変更
				mura_menu_state=ITEM;
				mura_menu_command=0;
				break;
			case 1://村を出る
				mura_state=WALK;
				mura_menu_command=0;
				mura_count=-1;
				practice=0;
				stage=0;
				boss.boss_num=0;
				boss.knd=-1;//enter_bossで1足されるため
				func_state=GAME_INI;
				break;
			case 2://タイトルに戻る
				mura_state=WALK;
				mura_menu_command=0;
				mura_count=-1;
				func_state=OPENING;
				break;
			case 3://キャンセル
				mura_menu_command=0;
				mura_state=WALK;
				break;
			}
		}
		break;
	case ITEM:
		if(CheckStatePad(configpad.bom)==1){
			mura_menu_state=FIRST;
			mura_menu_command=0;
		}
		if(CheckStatePad(configpad.down)==1){
			if(mura_menu_command%6==5){
				mura_menu_command-=5;
			}
			else{
				mura_menu_command++;
			}
		}
		if(CheckStatePad(configpad.up)==1){
			if(mura_menu_command%6==0){
				mura_menu_command=5;
			}
			else{
				mura_menu_command--;
			}
		}
		if(CheckStatePad(configpad.left) ==1 || CheckStatePad(configpad.right)==1){
			if(mura_menu_command/6==0){
				mura_menu_command+=6;
			}
			else{
				mura_menu_command-=6;
			}
		}
		break;
	}
}

CODE:

void graph_mura_menu(){
	if(mura_menu_state==FIRST){
		DrawBox(40,40+15*mura_menu_command,300,55+25*mura_menu_command,color[6],TRUE);
	}
	else if(mura_menu_state==ITEM){
		DrawBox(200+100*(mura_menu_command/6),50+70*(mura_menu_command%6),
			264+100*(mura_menu_command/6),114+70*(mura_menu_command%6),
			color[5],TRUE);
	}
	DrawStringToHandle(40,40,"装備を変更する",color[0],font[0]);
	DrawStringToHandle(40,55,"村から出る",color[0],font[0]);
	DrawStringToHandle(40,70,"メニューに戻る",color[0],font[0]);
	DrawStringToHandle(40,85,"キャンセル",color[0],font[0]);

	for(int i=0;i<12;i++){
		if(*equip_item[i]==1){
			DrawStringToHandle(200+100*(i/6),50+70*(i%6),"所持",color[0],font[0]);
		}
		else if(*equip_item[i]==2){
			DrawStringToHandle(200+100*(i/6),50+70*(i%6),"装備",color[0],font[0]);
		}
	}


}

CODE:

void mura_main(){
	if(mura_count==0) mura_ini();
	switch(mura_state){
	case WALK:
		m_ch_move();
		mura_graph();
		break;
	case SHOP:
		graph_shop();
		break;
	case MENU:
		control_mura_menu();
		graph_mura_menu();
		break;
	}
	mura_count++;
}
ここまでで村メニューがうまく動いていることを確認したら

ゲームの初期化、マークの描画、セーブで使うため、
item_stateとequip_itemをGV.hに移動します。

GV.hに以下を追加

CODE:

GLOBAL char item_state[3][23];//アイテムの状態
GLOBAL char *equip_item[12];//上記のうち装備品の場所
*equip_itemの中身はini.cppで代入します。
ini.cppに以下を追加

CODE:

char *e_item[12]={
	&item_state[0][0],
	&item_state[0][2],
	&item_state[0][4],
	&item_state[0][6],
	&item_state[0][8],
	&item_state[1][2],
	&item_state[0][1],
	&item_state[0][3],
	&item_state[0][5],
	&item_state[0][7],
	&item_state[0][9],
	&item_state[1][1],
};
ini.cppのfirst_ini()に以下を追加

CODE:

	//装備品設定
	for(int i=0;i<12;i++){
		equip_item[i]=e_item[i];
	}
そして、ゲーム中に装備状態を文字で表示するようにします。

graph.cppのgraph_board_status()に以下を追加

CODE:

	//装備品表示
	if(*equip_item[11]==2) DrawStringToHandle(FX+FMX+40,FY+FMY,"ド",color[0],font[0]);
	else if(*equip_item[5]==2) DrawStringToHandle(FX+FMX+40,FY+FMY,"ド",color[5],font[0]);

	if(*equip_item[0]==2 && *equip_item[6]==2) DrawStringToHandle(FX+FMX+60,FY+FMY,"吸",color[5],font[0]);
	else if(*equip_item[0]==2 || *equip_item[6]==2) DrawStringToHandle(FX+FMX+60,FY+FMY,"吸",color[0],font[0]);

	if(*equip_item[1]==2 && *equip_item[7]==2) DrawStringToHandle(FX+FMX+80,FY+FMY,"ラ",color[5],font[0]);
	else if(*equip_item[1]==2 || *equip_item[7]==2) DrawStringToHandle(FX+FMX+80,FY+FMY,"ラ",color[0],font[0]);

	if(*equip_item[2]==2 && *equip_item[8]==2) DrawStringToHandle(FX+FMX+100,FY+FMY,"自",color[5],font[0]);
	else if(*equip_item[2]==2 || *equip_item[8]==2) DrawStringToHandle(FX+FMX+100,FY+FMY,"自",color[0],font[0]);

	if(*equip_item[3]==2 && *equip_item[9]==2) DrawStringToHandle(FX+FMX+120,FY+FMY,"敵",color[5],font[0]);
	else if(*equip_item[3]==2 || *equip_item[9]==2) DrawStringToHandle(FX+FMX+120,FY+FMY,"敵",color[0],font[0]);

	if(*equip_item[4]==2 && *equip_item[10]==2) DrawStringToHandle(FX+FMX+140,FY+FMY,"喰",color[5],font[0]);
	else if(*equip_item[4]==2 || *equip_item[10]==2) DrawStringToHandle(FX+FMX+140,FY+FMY,"喰",color[0],font[0]);
これで今回の内容は終わりです。

コメントはまだありません。