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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jun3453
記事: 22
登録日時: 9年前
住所: 東京

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

#1

投稿記事 by jun3453 » 6年前

対戦型の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;
			}
		}
	}
アドバイスお願いします。

KORYUOH
記事: 44
登録日時: 7年前

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

#2

投稿記事 by KORYUOH » 6年前

ごく簡単に言うとwhileやめてif分でチェックだけするようにすればいい

後はゲームの仕様で切れたら自動とか幼いといけないとかで変わってくるのでコレだけだとなんともいえない
C言語を使うと自分の足を誤って撃ち抜いてしまうことがある。 C++を使えばそのような間違いを犯しにくくなる。しかし、やってしまったときには足全体が無くなる。

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

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

#3

投稿記事 by ISLe » 6年前

リロード中フラグを用意して状態遷移します。

コード:

// ---------
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;
			}
		}
	}
ウェイトは実時間ではなく、フレーム数をカウントするとかのゲーム内時間で処理することをお勧めします。

jun3453
記事: 22
登録日時: 9年前
住所: 東京

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

#4

投稿記事 by jun3453 » 6年前

仕様を書き忘れてました。申し訳ないです。

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

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

jun3453
記事: 22
登録日時: 9年前
住所: 東京

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

#5

投稿記事 by jun3453 » 6年前

今からISLeさんのやつを試してみようと思います!

jun3453
記事: 22
登録日時: 9年前
住所: 東京

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

#6

投稿記事 by jun3453 » 6年前

無事完成しました!
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;
			}
		}
	}

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

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

#7

投稿記事 by ISLe » 6年前

全弾弾切れでなくてもリロードできるようにしたわけですね。
リロード中に弾を撃ててしまうようですけど想定内なのでしょうか。

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


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

閉鎖

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