ページ 11

特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 00:59
by apricot
 今、私は、Zキーを押すと赤い弾の出るボール(方向キーで動く)を
作りたいと思っています。
 ですが、なぜか下キーと、左右キーのどちらかを、同時に押しながら、
Zキーを押すと、弾が出てきません。
 コードはこれです。

コード:

#include "DxLib.h"

int Key[256];

typedef struct{
	int x,y,t[3][10],tf;
}Player;
Player p;

int	GetKey(int InputKey[]){
	char All_Key[256];
	GetHitKeyStateAll( All_Key );
	for(int i=0;i<256;i++){
		if(All_Key[i]==1)	InputKey[i]++;
		else			InputKey[i]=0;
	}
	return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;

	int red=GetColor(255,0,0),white=GetColor(255,255,255),a,b;

	p.x=320;
	p.y=400;
	for(a=0;a<10;a++)
		for(b=0;b<3;b++)
			p.t[b][a]=0;
	p.tf=0;

    while(ProcessMessage()==0 && ClearDrawScreen()==0 &&
	GetKey(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){

		if(Key[KEY_INPUT_RIGHT]>0 && p.x<620)	p.x+=2;
		if(Key[KEY_INPUT_LEFT]>0 && p.x>20)	  p.x-=2;
		if(Key[KEY_INPUT_DOWN]>0 && p.y<460)	p.y+=1;
		if(Key[KEY_INPUT_UP]>0 && p.y>20)	  p.y-=2;
		
		if(p.tf>0)	p.tf--;
		for(a=0;a<10;a++){
			if(p.t[0][a]==0 && p.tf==0 && Key[KEY_INPUT_Z]>0){
				p.t[0][a]=1;
				p.t[1][a]=p.x;
				p.t[2][a]=p.y;
				p.tf=24;
			}else if(p.t[0][a]==1)
				if(p.t[2][a]<-5)
					for(b=0;b<3;b++)
						p.t[b][a]=0;
				else	p.t[2][a]-=8;
		}

		DrawBox(0,0,640,480,white,TRUE);
		DrawCircle(p.x,p.y,15,red,TRUE);
		for(a=0;a<10;a++)
			if(p.t[0][a]==1)
				DrawBox(p.t[1][a]-2,p.t[2][a]-5,p.t[1][a]+2,p.t[2][a]+5,red,TRUE);
			

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
今使っているのは、Vistaと、DXライブラリと、Visual C++ 2010 Expressです。
一応書いておきます。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 02:33
by ふりかけ
int Key[256]; や Player p; の宣言はWinMain内に書いた方がいいかなと思います
Player構造体のメンバ変数 tf は発射間隔とかでしょうか。コメントがほしいです。
t は弾かな、これは構造体の配列にしたほうが分かりやすそうです。

コード:

typedef struct ___tama{
       int flag, x, y;
} tama;

typedef struct ___Player{
       int x, y, tf;
       tama t[10];
} Player;
肝心のzキーのことですが、分かりません。キーボードによって同時押しできる数が決まってたりしますが、関係あるかなぁ?

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 07:21
by beatle
メモ帳などのテキストエディタを使って、矢印キーを押しながらZキーを押してみれば何か分かるかもしれません。
エディタ上でさえZが入力できないなら、それはキーボード自体の制限の可能性があります。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 09:05
by 史上最悪のデスペナ
DXLibは3つ以上のキー判定は出来ないってどっかで見たことある気がします。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 09:06
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:DXLibは3つ以上のキー判定は出来ないってどっかで見たことある気がします。
それはDXLIBの制限ではなくキーボードの性能的制限です。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 09:14
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:それはDXLIBの制限ではなくキーボードの性能的制限です。
そうだったんですか。知らなかったです。お恥ずかしい^^;

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 09:35
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:
softya(ソフト屋) さんが書きました:それはDXLIBの制限ではなくキーボードの性能的制限です。
そうだったんですか。知らなかったです。お恥ずかしい^^;
普通のキーボードは特定のキーを除いて同時3つ押しをちゃんと検出できません。
それが出来るのはゲーム専用キーボードなど特殊なキーボードだけですね。

たぶん、いちばん安いのはマイクロソフトの「SideWinder X4 Keyboard」でしょうか。最大で26キー同時押しの対応です。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 10:19
by beatle
同時押しについて気になったので調べてみました。
http://wikiwiki.jp/fpag/?%A5%AD%A1%BC%A ... 4%A4%A4%C6
Nキーロールオーバーと「同時に押下されているキー数をいくつまで認識できるか」は厳密には関係がない。
だそうです。REALFORCEのUSB版が6キー同時押し対応なのと比べると、SideWinderがいかに凄いかが分かりますね。
あ、ちなみにPS/2版のREALFORCEなら全キー同時押し対応らしいですが。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 11:00
by 史上最悪のデスペナ
26キー同時押しとか全キー同時押しって一体どんな状況なんでしょうw?
一つのキーボードを使って二人で格闘技対戦でも26も使わない気が・・・・・・

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 13:49
by apricot
 返信ありがとうございます。
 原因(と言っていいものか)が分かりました。
 どうやら、VC++2010EEか、ノートパソコンだったのが
悪かったらしく、家族共用のパソコンで起動してみると、普通に出来ました。

Re: 特定のキーを同時に押すと反応しなくなる

Posted: 2011年11月26日(土) 14:09
by softya(ソフト屋)
apricot さんが書きました: 返信ありがとうございます。
 原因(と言っていいものか)が分かりました。
 どうやら、VC++2010EEか、ノートパソコンだったのが
悪かったらしく、家族共用のパソコンで起動してみると、普通に出来ました。
VC++2010EEは考えられないと思いますので、ノートパソコンが原因だと思います。