ページ 11

STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 02:13
by jun3453
対戦型のSTGを作っています。
思い付きで弾をリロード式にしようと思い、やろうと思ったのですが、
Sleepや、Wait、while(GetNowCount() - スタート時刻 < 時間)ではゲーム自体が止まってしまいますよね?
そういうときはどのような処理をさせたらよいのでしょうか?
一応このような形で作っています。

Ammo = 弾数

コード:

	if(keyInstance->GetInputKeyFrame(keyInstance->keyInput.P1shot) % 10 == 1){	//弾丸生成	
		if(Ammo > 0){
			creatBullet();
			Ammo -= 1;
		}
	}
	if(keyInstance->GetInputKeyFrame(keyInstance->keyInput.P1reload)){
		if(Ammo == 0){
			while(GetNowCount() - timer < 3000){     //ここの処理で止まらないようにするためには?
					Ammo = 6;
			}
		}
	}
アドバイスお願いします。

Re: STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 08:11
by KORYUOH
ごく簡単に言うとwhileやめてif分でチェックだけするようにすればいい

後はゲームの仕様で切れたら自動とか幼いといけないとかで変わってくるのでコレだけだとなんともいえない

Re: STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 15:06
by ISLe
リロード中フラグを用意して状態遷移します。

コード:

// ---------
bool reloading = false; // リロード中フラグ
// ---------

	if(Ammo > 0){
		if(keyInstance->GetInputKeyFrame(keyInstance->keyInput.P1shot) % 10 == 1){  //弾丸生成  
			creatBullet();
			Ammo -= 1;
		}
	}
	else {
		if (!reloading) {
			if(keyInstance->GetInputKeyFrame(keyInstance->keyInput.P1reload)){
				reloading = true;
				timer = GetNowCount();
			}
		}
		else {
			if (GetNowCount() - timer >= 3000){     //ここの処理で止まらないようにするためには?
				reloading = false;
				Ammo = 6;
			}
		}
	}
ウェイトは実時間ではなく、フレーム数をカウントするとかのゲーム内時間で処理することをお勧めします。

Re: STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 15:09
by jun3453
仕様を書き忘れてました。申し訳ないです。

弾が6発で、
ショットボタンとリロードボタンに分けておいて、
とりあえず弾が0の時にリロードボタンを押すことでリロードとしています。

ただそれだとリロードボタンとショットボタンを連打するだけでリロードの意味がないため、
3秒のリロードタイムを設けることにしたのですが、
最初のとおりSleepや、Wait、while(GetNowCount() - スタート時刻 < 時間)ではゲームが止まってしまうのでどうしようかなといった状況です。

Re: STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 15:10
by jun3453
今からISLeさんのやつを試してみようと思います!

Re: STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 15:59
by jun3453
無事完成しました!
ISLeさんありがとうございました!

コード:

	if(keyInstance->GetInputKeyFrame(keyInstance->keyInput.P1shot) % 10 == 1){	//弾丸生成	
		if(Ammo > 0){
			creatBullet();
			Ammo -= 1;
		}
	}else{
		if(!Reloading){
			if(keyInstance->GetInputKeyFrame(keyInstance->keyInput.P1reload)){
				Reloading = true;
				timer = GetNowCount();
			}
		}else{
			if(GetNowCount() - timer >= 3000){
				Reloading = false;
				Ammo = 6;
			}
		}
	}

Re: STGで弾をリロード式にする工夫をしているのですが・・・

Posted: 2013年7月19日(金) 17:28
by ISLe
全弾弾切れでなくてもリロードできるようにしたわけですね。
リロード中に弾を撃ててしまうようですけど想定内なのでしょうか。

ボタン押しっぱなしで一発撃ったら即リロードになってしまうのでリロード自体はペナルティとなりませんね。
ショットボタン押しっぱなしに対するペナルティにしかなっていないのでリロードという設定が不自然に感じます。


コードはメンテを考えるとショットの処理も状態遷移に合わせたほうが良いと思いますけど。