ボムの回数制限

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
@Ria

ボムの回数制限

#1

投稿記事 by @Ria » 7年前

シューティングゲームを作成して、ボムの回数制限で悩んでいます。

ボムを5回使用したらもうボムを使えなくするようにしたいのですが、そのような場合はどうすればいいのでしょうか?

キーボードの入力制限(?)がわからずに困っております。過去ログも探しましたが見つかりませんでしたのでよろしければご返答お願いします

なにか例をあげてくれれば助かります。

ホヅミ
記事: 110
登録日時: 9年前

Re: ボムの回数制限

#2

投稿記事 by ホヅミ » 7年前

ボムのカウント用変数を用意して、ボムを使うたびに―1をする。
変数が0になったらif文でボム発射の部分を飛ばす
というのはダメですかね?

@Ria

Re: ボムの回数制限

#3

投稿記事 by @Ria » 7年前

速い回答ありがとうございます。

飛ばすとは、ボム処理をしないということですか?

@Ria

Re: ボムの回数制限

#4

投稿記事 by @Ria » 7年前

龍神録プログラミングの館様のプログラムコードを使わせてもらっています
回数を減らして表示させることはできましたが、5回使用したら、使えなくするという処理がわかりません。どのようにかけばいいのでしょうか?ご返答お願いいたします

コード:

//ボムを登録
void enter_bom(){
	int b;
    int k;
    bom.flag=1;
    bom.cnt=0;
    bom.knd=0;
    ch.flag=0;
    ch.mutekicnt=1;//無敵に
    se_flag[14]=1;//キュイーン音
    //縦線
    if((k=search_effect())!=-1){
        effect[k].flag=1;
        effect[k].cnt=0;
        effect[k].knd=3;//ボムの線のエフェクト
        effect[k].brt=0;
        effect[k].ang=PI/2;
        effect[k].mvang=-PI/2;
        effect[k].spd=1;
        effect[k].r=1;
        effect[k].eff=2;
        effect[k].img=img_eff_bom[3];
        effect[k].x=70;
        effect[k].y=300;
    }
    //横線
    if((k=search_effect())!=-1){
        effect[k].flag=1;
        effect[k].cnt=0;
        effect[k].knd=3;//ボムの線のエフェクト
        effect[k].brt=0;
        effect[k].ang=0;
        effect[k].mvang=0;
        effect[k].spd=1;
        effect[k].r=1;
        effect[k].eff=2;
        effect[k].img=img_eff_bom[3];
        effect[k].x=100;
        effect[k].y=350;
    }
    //キャラ
    if((k=search_effect())!=-1){
        effect[k].flag=1;
        effect[k].cnt=0;
        effect[k].knd=2;//ボムのキャラ・線のエフェクト
        effect[k].brt=0;
        effect[k].ang=0;
        effect[k].mvang=-PI/2;
        effect[k].spd=0.7;
        effect[k].r=1;
        effect[k].eff=2;
        effect[k].img=img_eff_bom[2];
        effect[k].x=260;
        effect[k].y=300;
    }
}

//ボム計算
void bom_calc(){
    int n,k;
	double shot_angle[4]={0,PI,PI/2,PI*1.5};//4発エフェクトが飛ぶ角度
    if((ch.flag==0||ch.flag==1) && bom.flag==0){//キャラが通常か喰らいボム状態で、ボムがオフなら
        if(CheckStatePad(configpad.bom)==1){//ボムボタンが押されたら
			ch.bom=ch.bom-1;   ←これで、回数が減っていくようにしています。ch.bomの初期値は5にしてあります。
            enter_bom();
        }
    }
    if(bom.flag==1){//ボムが登録されていたら
        if(bom.cnt%10==0){//1/6秒に1回
            n=(bom.cnt/10);
            if(n<4 && (k=search_effect())!=-1){
                effect[k].flag=1;
                effect[k].cnt=0;
                effect[k].knd=1;//エフェクト番号1:ボムのエフェクト
                effect[k].brt=0;
                effect[k].ang=rang(PI);//画像の向きはランダム
                effect[k].mvang=shot_angle[n]-PI/4;//飛ぶ方向
                effect[k].spd=13+rang(2);//スピード
                effect[k].r=0.5;//大きさ
                effect[k].eff=2;//αブレンド
                effect[k].img=img_eff_bom[(bom.cnt/10)/3];//画像
                effect[k].x=ch.x;//座標
                effect[k].y=ch.y;
            }
        }
        bom.cnt++;
        if(bom.cnt<40)
            bright_set.brt=255-bom.cnt*5;//画面の明るさ設定(暗く)
        if(bom.cnt>90)
            bright_set.brt=255-40*5+(bom.cnt-90)*5;//画面の明るさ設定(明るく)
        if(bom.cnt>130){
            bom.flag=0;
            bright_set.brt=255;
        }
    }

}


void enter_crybom_effect(){
    int k;
    if(ch.flag==1){
        if(ch.cnt%2==0){
            if((k=search_effect())!=-1){
                effect[k].flag=1;
                effect[k].cnt=0;
                effect[k].knd=4;//喰らいボムエフェクト
                effect[k].brt=255;
                effect[k].ang=rang(PI);
                effect[k].spd=0;
                effect[k].r=0;
                effect[k].eff=2;
                effect[k].img=img_del_effect[GetRand(4)];
                effect[k].x=ch.x;
                effect[k].y=ch.y;
            }
        }
    }
}

void calc_child(){
	for(int i=0;i<CHILD_MAX;i++){
		if(child[i].flag>0){
			child[i].x+=cos(child[i].angle)*child[i].spd;
			child[i].y+=sin(child[i].angle)*child[i].spd;
			child[i].cnt++;
		}
	}
}

void effect_main(){
	calc_child();
    dn_calc();//ドガーンとゆれる画面の処理
    calc_del_effect();//消滅エフェクトの計算
    calc_effect();//エフェクトの計算
    bom_calc();//ボム計算
    enter_crybom_effect();
}

nil
記事: 428
登録日時: 8年前

Re: ボムの回数制限

#5

投稿記事 by nil » 7年前

ホズミさんがまんま答えているのですが、
一応、

bom_t構造体に使用回数を保存する変数を追加、
初期化時にその変数に残り使用可能回数を代入、
ボム発射部分をif文で区切るなどして、使用可能回数が0の時は処理をパスする、
ボムを撃つたびに使用回数をデクリメントする。

以上のとおりに処理を組めばよいかと思います。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: ボムの回数制限

#6

投稿記事 by ISLe » 7年前

ch.bomが0より大きいときだけ1引く(0未満にならないようにする)という処理は書けますか?

@Ria

Re: ボムの回数制限

#7

投稿記事 by @Ria » 7年前

解決いたしました!ご回答ありがとうございました

nil
記事: 428
登録日時: 8年前

Re: ボムの回数制限

#8

投稿記事 by nil » 7年前

フォーラムルールですので、解決された方法を書き込んでください。

@Ria

Re: ボムの回数制限

#9

投稿記事 by @Ria » 7年前

コード:

#include "../include/GV.h"

extern void dn_calc();

//エフェクトの登録空き番号を探す
int search_effect(){
    for(int i=0;i<EFFECT_MAX;i++){
        if(effect[i].flag==0)
            return i;
    }
    return -1;
}

//エフェクトを計算する
void calc_effect(){
    for(int i=0;i<EFFECT_MAX;i++){
        if(effect[i].flag>0){//エフェクトが登録されていたら
            effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
            effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
            switch(effect[i].knd){//エフェクトの種類によって分岐
                case 0://敵の消滅エフェクト
                    effect[i].cnt++;
                    effect[i].r+=0.08;//エフェクトの大きさを段々大きくする
                    if(effect[i].cnt>10)//10カウント以上になったら
                        effect[i].brt-=25;//明るさを少なくする
                    if(effect[i].cnt>20)//20カウント以上になったら
                        effect[i].flag=0;//消す
                    break;
                case 1://ボムのエフェクト
                    //スピード計算
                    if(effect[i].cnt<60)
                        effect[i].spd-=(0.2+effect[i].cnt*effect[i].cnt/3000.0);
                    if(effect[i].cnt==60){
                        effect[i].spd=0;
                        se_flag[15]=1;
						enter_dn(11,20);//(45)
                    }
                    //明るさと大きさ計算
                    effect[i].r+=0.015;
                    if(effect[i].cnt<51)
                        effect[i].brt+=5;
                    if(effect[i].cnt>=60){
                        effect[i].r+=0.04;
                        effect[i].brt-=255/30.0;
                    }
                    //カウントアップと消去計算
                    effect[i].cnt++;
                    if(effect[i].cnt>=90)
                        effect[i].flag=0;
                    break;
                case 2://ボムエフェクト(キャラ)
                    //明るさ計算
                    if(effect[i].cnt<51)
                        effect[i].brt+=4;
                    if(effect[i].cnt>130-51)
                        effect[i].brt-=4;
                    //カウントアップと消去計算
                    effect[i].cnt++;
                    if(effect[i].cnt>=130)
                        effect[i].flag=0;
                    break;
                case 3://ボムのエフェクト(ライン)
                    //明るさ計算
                    if(effect[i].cnt<51)
                        effect[i].brt+=2;
                    if(effect[i].cnt>130-51)
                        effect[i].brt-=2;
                    //カウントアップと消去計算
                    effect[i].cnt++;
                    if(effect[i].cnt>=130)
                        effect[i].flag=0;
                    break;                
                case 4://喰らいボムエフェクト
                    //明るさ計算
                    if(effect[i].cnt>=6)
                        effect[i].brt-=255/6;
                    effect[i].r+=0.12;
                    effect[i].cnt++;
                    if(effect[i].cnt>=12 || ch.flag!=1)
                        effect[i].flag=0;
                    break;                
                default:
                    printfDx("effect設定エラー\n");
                    break;
            }
        }
    }
}

//消滅エフェクトの登録空き番号を探す
int search_del_effect(){
    for(int i=0;i<DEL_EFFECT_MAX;i++){
        if(del_effect[i].flag==0)
            return i;
    }
    return -1;
}

//消滅エフェクトを登録する
void enter_del_effect(int s){
    int k=search_del_effect();
    if(k!=-1){
        del_effect[k].flag=1;//フラグを立てる
        del_effect[k].cnt=0;
        del_effect[k].col=enemy[s].back_col;//敵の背景色を消滅色に設定する
        del_effect[k].x=enemy[s].x;//敵の座標を消滅位置にセット
        del_effect[k].y=enemy[s].y;
    }
}

//消滅エフェクトを計算・エフェクトを登録する
void calc_del_effect(){
    int k;
    for(int i=0;i<DEL_EFFECT_MAX;i++){
        if(del_effect[i].flag>0){
            if(del_effect[i].cnt%2==0){// 1/30秒ずつセット
                if((k=search_effect())!=-1){//空き番号検索
                    memset(&effect[k],0,sizeof(effect_t));//初期化
                    effect[k].flag=1;//フラグを立てる
                    effect[k].brt=255;//輝度を最大値に
                    effect[k].ang=rang(PI);//角度をランダムに
                    effect[k].col=del_effect[i].col;//色をセット
                    effect[k].eff=1;//1は光エフェクト。光エフェクトにセットする
                    effect[k].img=img_del_effect[effect[k].col];//消滅する画像をセット
                    effect[k].knd=0;//エフェクトの種類は0番(消滅エフェクトは0とする)
                    effect[k].x=del_effect[i].x;//座標をセット
                    effect[k].y=del_effect[i].y;
                    effect[k].spd=0;
                }
            }
            if(del_effect[i].cnt>8){
                del_effect[i].flag=0;
            }
            del_effect[i].cnt++;
        }
    }
}

//ボムを登録
void enter_bom(){
	int b;
    int k;
    bom.flag=1;
    bom.cnt=0;
    bom.knd=0;
    ch.flag=0;
    ch.mutekicnt=1;//無敵に
    se_flag[14]=1;//キュイーン音
    //縦線
    if((k=search_effect())!=-1){
        effect[k].flag=1;
        effect[k].cnt=0;
        effect[k].knd=3;//ボムの線のエフェクト
        effect[k].brt=0;
        effect[k].ang=PI/2;
        effect[k].mvang=-PI/2;
        effect[k].spd=1;
        effect[k].r=1;
        effect[k].eff=2;
        effect[k].img=img_eff_bom[3];
        effect[k].x=70;
        effect[k].y=300;
    }
    //横線
    if((k=search_effect())!=-1){
        effect[k].flag=1;
        effect[k].cnt=0;
        effect[k].knd=3;//ボムの線のエフェクト
        effect[k].brt=0;
        effect[k].ang=0;
        effect[k].mvang=0;
        effect[k].spd=1;
        effect[k].r=1;
        effect[k].eff=2;
        effect[k].img=img_eff_bom[3];
        effect[k].x=100;
        effect[k].y=350;
    }
    //キャラ
    if((k=search_effect())!=-1){
        effect[k].flag=1;
        effect[k].cnt=0;
        effect[k].knd=2;//ボムのキャラ・線のエフェクト
        effect[k].brt=0;
        effect[k].ang=0;
        effect[k].mvang=-PI/2;
        effect[k].spd=0.7;
        effect[k].r=1;
        effect[k].eff=2;
        effect[k].img=img_eff_bom[2];
        effect[k].x=260;
        effect[k].y=300;
    }
}

//ボム計算
void bom_calc(){
    int n,k;
	double shot_angle[4]={0,PI,PI/2,PI*1.5};//4発エフェクトが飛ぶ角度
    if((ch.flag==0||ch.flag==1) && bom.flag==0){//キャラが通常か喰らいボム状態で、ボムがオフなら
        if(CheckStatePad(configpad.bom)==1){//ボムボタンが押されたら
			ch.bom=ch.bom-1;
            enter_bom();
        }
    }
    if((bom.flag==1)&&(ch.bom>-1)){//ボムが登録されていたら。0になったらボム使用不可
        if(bom.cnt%10==0){//1/6秒に1回
            n=(bom.cnt/10);
            if(n<4 && (k=search_effect())!=-1){
                effect[k].flag=1;
                effect[k].cnt=0;
                effect[k].knd=1;//エフェクト番号1:ボムのエフェクト
                effect[k].brt=0;
                effect[k].ang=rang(PI);//画像の向きはランダム
                effect[k].mvang=shot_angle[n]-PI/4;//飛ぶ方向
                effect[k].spd=13+rang(2);//スピード
                effect[k].r=0.5;//大きさ
                effect[k].eff=2;//αブレンド
                effect[k].img=img_eff_bom[(bom.cnt/10)/3];//画像
                effect[k].x=ch.x;//座標
                effect[k].y=ch.y;
            }
        }
        bom.cnt++;
        if(bom.cnt<40)
            bright_set.brt=255-bom.cnt*5;//画面の明るさ設定(暗く)
        if(bom.cnt>90)
            bright_set.brt=255-40*5+(bom.cnt-90)*5;//画面の明るさ設定(明るく)
        if(bom.cnt>130){
            bom.flag=0;
            bright_set.brt=255;
        }
    }

}


void enter_crybom_effect(){
    int k;
    if((ch.flag==1)&&(ch.bom>0)){
        if(ch.cnt%2==0){
            if((k=search_effect())!=-1){
                effect[k].flag=1;
                effect[k].cnt=0;
                effect[k].knd=4;//喰らいボムエフェクト
                effect[k].brt=255;
                effect[k].ang=rang(PI);
                effect[k].spd=0;
                effect[k].r=0;
                effect[k].eff=2;
                effect[k].img=img_del_effect[GetRand(4)];
                effect[k].x=ch.x;
                effect[k].y=ch.y;
            }
        }
    }
}

void calc_child(){
	for(int i=0;i<CHILD_MAX;i++){
		if(child[i].flag>0){
			child[i].x+=cos(child[i].angle)*child[i].spd;
			child[i].y+=sin(child[i].angle)*child[i].spd;
			child[i].cnt++;
		}
	}
}

void effect_main(){
	calc_child();
    dn_calc();//ドガーンとゆれる画面の処理
    calc_del_effect();//消滅エフェクトの計算
    calc_effect();//エフェクトの計算
    bom_calc();//ボム計算
    enter_crybom_effect();
}
このようなプログラムにしたら無事解決いたしました

ch.bomの初期値を5に設定して、ボム登録のif文にch.bom>0と追加したところ回数制限をつけることができました。

閉鎖

“C言語何でも質問掲示板” へ戻る