前回の続きです。
その品物を買ったかどうか,装備したかどうかの変数を用意します。
mura.cppに以下を追加
決定キーを押したとき、買っていなく、お金が値段以上ならば
お金を減らし、対応する変数を1にする。
mura.cppのgraph_shop()に以下を追加
//品物を買う
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];
}
}
//所持金表示
DrawStringToHandle(400,0,"所持金",color[0],font[0]);
DrawFormatStringToHandle(480,0,color[0],font[0],"%d",ch.money);
2.村メニュー
店の処理ができたので今度はアイテムを装備するため、メニューを実装します。
止まっているときにESCキーを押すとメニューが出るようにします。
以下を変更。 mura.cppのm_ch_move()に以下を追加
//村メニューの状態を表す変数
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],
};
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;
}
}
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]);
}
}
}
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に以下を追加
*equip_itemの中身はini.cppで代入します。
ini.cppに以下を追加
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],
};
そして、ゲーム中に装備状態を文字で表示するようにします。
graph.cppのgraph_board_status()に以下を追加
//装備品表示
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]);