ページ 11

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

Posted: 2014年4月16日(水) 22:08
by 玉井
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;
}



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

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

Posted: 2014年4月16日(水) 22:17
by みけCAT
まず分かることは、22行目で比較演算子が使われているため、演算子オーバーロードをしないとリセットはできないと思います。

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

Posted: 2014年4月16日(水) 22:19
by みけCAT
提示されたコードの中に、AbuttonflgやBbuttonflgをtrueにしているコードが見当たりません。
その部分の処理を確認してください。

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

Posted: 2014年4月16日(水) 22:28
by 玉井
みけ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: ボタンの同時押し 暴発は防ぐ

Posted: 2014年4月16日(水) 23:01
by ココ
検討違いでしたらごめんなさい
処理の中でボタンカウントは初期化してますでしょうか?
見当たりませんでしたので…

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

Posted: 2014年4月16日(水) 23:04
by ココ
すみません、カウントリセットされてると記載御座いましたね
先程のレスは見なかった事にして下さい

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

Posted: 2014年4月17日(木) 00:15
by みけCAT
this->buttoncountを0にしている部分が提示されたコードの中には見当たりません。

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

Posted: 2014年4月17日(木) 00:24
by 玉井
みけ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: ボタンの同時押し 暴発は防ぐ

Posted: 2014年4月17日(木) 00:25
by 玉井
あー、同じところ書き損じしました。
現在の最終ソースはこちらです。

コード:

 
---------更新関数内------
//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: ボタンの同時押し 暴発は防ぐ

Posted: 2014年4月17日(木) 02:10
by 玉井
すみません、自力で解決しました。

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

Posted: 2014年4月17日(木) 22:00
by みけCAT
どのように改良したら解決できたのかを書き込んでいただけるとありがたいです。
フォーラムルール さんが書きました:4. 義務行為

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

・トピックを立て、解決した場合は「解決しました」とだけ書かず、どうやって解決したか他の人に分かるように書いて
 からトピックを終了して下さい。