ボタンの同時押し 暴発は防ぐ

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

ボタンの同時押し 暴発は防ぐ

#1

投稿記事 by 玉井 » 12年前

Aボタン(Aの弾を発射)、Bボタン(Bの弾を発射)、
そして同時押しの場合は(Cの弾を発射)としたいのですが
やはり、Cの弾を発射させると、AやBの弾が暴発し、
Cの弾と一緒に出てしまいます。

で、検索し、こちらの掲示板のこの質問に対してのISLeさんのレスの
http://dixq.net/forum/viewtopic.php?f=3&t=12442

プログラムでどうにかするのであれば、
【1フレーム目】A,Sキーのいずれかあるいは両方が押されたらカウント開始
【3フレーム目】Aキーのみが押されていたらモーション1を開始。
Sキーのみ押されていたらモーション2を開始。A,Sキー両方押されていたらモーション3を開始。
とすれば良いのではないでしょうか。


を参考に、自分で作って試しているのですが
A,B,C、いずれかの弾が出ない、または、押してる間弾が出っ放し、等
どうもうまくいきません。。。。
どの部分がおかしいのか、どうすれば上記の内容を正常に行えるプログラムとなるのか
ご教示頂けないでしょうか。

コード:

---------更新関数内------
//AかBのボタンが入力された
if(Key & PAD_INPUT_A && this->Abuttonflg==false || Key & PAD_INPUT_B && this->Bbuttonflg==false)
{
   this->buttoncount_flg=true;//なにかのボタンを押したらスタート
}
if(this->buttoncount_flg==true)//フラグが立ってる間
{
	this->buttoncount++;//押してる時間をカウント中
}

if(this->buttoncount > 3){//3フレーム後、どのボタンが押されているかを判断して実行
   if(Abuttonflg==true && Bbuttonflg==false){//Aボタンだけが押されてた状態
     Aの弾発射 
   }   
   if(Abuttonflg==false && Bbuttonflg==true){//Bボタンだけが押されてた状態
     Bの弾発射 
   }
      if(Abuttonflg==false && Bbuttonflg==true){//AとB、両方押されてた状態
          Cの弾発射
      }
   this->buttoncount_flg==false;//リセット
}

//各ボタンが押されているかどうかの判断
if( (Key & PAD_INPUT_A)==0 ){
   Abuttonflg=false;//ボタンを放していればfalse
}
if( (Key & PAD_INPUT_B)==0 ){
   Bbuttonflg=false;
}



イメージとしては、
ボタンは押しっぱなしでは連射させない仕様でいきたく、
なにかが押されるたびにフレームのカウントを取り
カウント後にはリセット。
その時にどのボタンを押しているかで
処理される内容が変わる、と言った感じです。
いろいろいじってたら、弾すら出なくなりました。。。
プログラム文もシンプルでいいはずなのに、
再現出来ず、情けないです。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ボタンの同時押し 暴発は防ぐ

#2

投稿記事 by みけCAT » 12年前

まず分かることは、22行目で比較演算子が使われているため、演算子オーバーロードをしないとリセットはできないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ボタンの同時押し 暴発は防ぐ

#3

投稿記事 by みけCAT » 12年前

提示されたコードの中に、AbuttonflgやBbuttonflgをtrueにしているコードが見当たりません。
その部分の処理を確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

玉井

Re: ボタンの同時押し 暴発は防ぐ

#4

投稿記事 by 玉井 » 12年前

みけCAT さんが書きました:まず分かることは、22行目で比較演算子が使われているため、演算子オーバーロードをしないとリセットはできないと思います。
すみません、ミスです。そこはfalseを代入する、でした。
ミス this->buttoncount_flg == false;//リセット
           ↓
this->buttoncount_flg = false;//リセット
みけCAT さんが書きました:AbuttonflgやBbuttonflgをtrueにしているコード
そうでした。
trueにするのを削除した状態をこちらに転記してしまいました。
これで大丈夫かと思いますが、どうですか?
ただ、これで実行してもうまくいきませんが、、、

コード:

 
	//各ボタンを離したかどうか判断
	if( (Key & PAD_INPUT_A)==0 ){
		Abuttonflg=false;//ボタンを放していればfalse
	}else{Abuttonflg=true;}
	if( (Key & PAD_INPUT_B)==0 ){
		Bbuttonflg=false;
	}else{Bbuttonflg=true;}

ココ

Re: ボタンの同時押し 暴発は防ぐ

#5

投稿記事 by ココ » 12年前

検討違いでしたらごめんなさい
処理の中でボタンカウントは初期化してますでしょうか?
見当たりませんでしたので…

ココ

Re: ボタンの同時押し 暴発は防ぐ

#6

投稿記事 by ココ » 12年前

すみません、カウントリセットされてると記載御座いましたね
先程のレスは見なかった事にして下さい

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ボタンの同時押し 暴発は防ぐ

#7

投稿記事 by みけCAT » 12年前

this->buttoncountを0にしている部分が提示されたコードの中には見当たりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

玉井

Re: ボタンの同時押し 暴発は防ぐ

#8

投稿記事 by 玉井 » 12年前

みけCAT さんが書きました:this->buttoncountを0にしている部分が提示されたコードの中には見当たりません。
そうですね、自分のプログラムには記載してましたので
また書き損じでした。修正させて頂きます。

ただ、これらを書き加えても、動かないんで、
なんか根本的にどっかがおかしいと思うんですけど。。。

コード:

 
---------更新関数内------
//AかBのボタンが入力された
if(Key & PAD_INPUT_A && this->Abuttonflg==false || Key & PAD_INPUT_B && this->Bbuttonflg==false)
{
   this->buttoncount_flg=true;//なにかのボタンを押したらスタート
}
if(this->buttoncount_flg==true)//フラグが立ってる間
{
    this->buttoncount++;//押してる時間をカウント中
}
 
if(this->buttoncount > 3){//3フレーム後、どのボタンが押されているかを判断して実行
   if(Abuttonflg==true && Bbuttonflg==false){//Aボタンだけが押されてた状態
     Aの弾発射 
   }   
   if(Abuttonflg==false && Bbuttonflg==true){//Bボタンだけが押されてた状態
     Bの弾発射 
   }
      if(Abuttonflg==false && Bbuttonflg==true){//AとB、両方押されてた状態
          Cの弾発射
      }
   this->buttoncount_flg==false;//リセット
       this->buttoncount=0;//リセット      ←修正箇所
}

//各ボタンを離したかどうか判断
if( (Key & PAD_INPUT_A)==0 ){
      Abuttonflg=false;//ボタンを放していればfalse
}else{Abuttonflg=true;}
if( (Key & PAD_INPUT_B)==0 ){
      Bbuttonflg=false;
}else{Bbuttonflg=true;}

 

玉井

Re: ボタンの同時押し 暴発は防ぐ

#9

投稿記事 by 玉井 » 12年前

あー、同じところ書き損じしました。
現在の最終ソースはこちらです。

コード:

 
---------更新関数内------
//AかBのボタンが入力された
if(Key & PAD_INPUT_A && this->Abuttonflg==false || Key & PAD_INPUT_B && this->Bbuttonflg==false)
{
   this->buttoncount_flg=true;//なにかのボタンを押したらスタート
}
if(this->buttoncount_flg==true)//フラグが立ってる間
{
    this->buttoncount++;//押してる時間をカウント中
}
 
if(this->buttoncount > 3){//3フレーム後、どのボタンが押されているかを判断して実行
   if(Abuttonflg==true && Bbuttonflg==false){//Aボタンだけが押されてた状態
     Aの弾発射 
   }   
   if(Abuttonflg==false && Bbuttonflg==true){//Bボタンだけが押されてた状態
     Bの弾発射 
   }
      if(Abuttonflg==false && Bbuttonflg==true){//AとB、両方押されてた状態
          Cの弾発射
      }
   this->buttoncount_flg=false;//リセット
       this->buttoncount=0;//リセット      ←修正箇所
}

//各ボタンを離したかどうか判断
if( (Key & PAD_INPUT_A)==0 ){
      Abuttonflg=false;//ボタンを放していればfalse
}else{Abuttonflg=true;}
if( (Key & PAD_INPUT_B)==0 ){
      Bbuttonflg=false;
}else{Bbuttonflg=true;}

 
[/quote]

玉井

Re: ボタンの同時押し 暴発は防ぐ

#10

投稿記事 by 玉井 » 12年前

すみません、自力で解決しました。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ボタンの同時押し 暴発は防ぐ

#11

投稿記事 by みけCAT » 12年前

どのように改良したら解決できたのかを書き込んでいただけるとありがたいです。
フォーラムルール さんが書きました:4. 義務行為

[C言語何でも質問掲示板でのみ適用される事項]

・トピックを立て、解決した場合は「解決しました」とだけ書かず、どうやって解決したか他の人に分かるように書いて
 からトピックを終了して下さい。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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