方向キーなど一部のキー入力が認識されない

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

方向キーなど一部のキー入力が認識されない

#1

投稿記事 by yuki1207 » 12年前

現在龍神録プログラミングのページを元に1章から順番に作ってみているのですが
キー入力処理のところでうまくいきません
GetHitKeyStateAll関数を使って配列に格納した値を元にキャラクターを上下左右に動かしたいのですが
おかしなことにZキーやXキーなどは認識するのに方向キーやHome,Insertキーなど一部のキーが反応してくれません
ためしに上下左右の移動をaswdなどのアルファベットのキーに割り当てたらきちんと動作しました
どこか記述を間違ってしまったのでしょうか?アドバイスをお願いします

ソースコードは数が多いので関係がありそうなメイン関数(main.cpp)とキー入力処理に関する部分(key.cpp)とキャラクタに関する部分(char.cpp)だけ貼っておきますが
基本的に龍神録プログラミングのページの解説どおりに作っています(変数や配列の名前だけは変えたりしていますが・・・

<main.cpp>

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

int ProcessLoop(){
	if(ProcessMessage()!=0) return -1;
	if(ClearDrawScreen()!=0) return -1;
	GetHitKeyFrameAll();
	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;		//初期化と裏画面処理
	load();	//データロード

	while(ProcessLoop()!=-1){//メインループ
		switch(func_state){
			case 0:
				load();		//データのロード
				first_ini();	//初回の初期化
				func_state=100;
				break;
			case 100:
				calc_ch();	//キャラクタ情報計算
				graph_main();	//描画メイン
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}
		if(CheckKeyFrame(KEY_INPUT_ESCAPE)==1)break;	//ESCキーで終了
		ScreenFlip();	//裏画面反映
	}
	DxLib_End();
    return 0;
}
<key.cpp>

コード:

#include "../include/GV.h"

int KeyFrame[256];	//各キーの押下されているフレーム数を格納

//GetHitKeyFrameAll関数
//引数で与えた配列KeyFrame[]にすべてのキーのフレーム数を格納する関数
int GetHitKeyFrameAll(){
	char KeyState[256];
	GetHitKeyStateAll(KeyState);
	for(int i=0;i<256;i++){
		if(KeyState[i]==1)KeyFrame[i]++;
		else KeyFrame[i]=0;
	}
	return 0;
}

//CheckKeyFrame関数
//引数で与えたキーコードのキーフレーム数を取得
int CheckKeyFrame(char Handle){
	return KeyFrame[Handle];
}
<char.cpp>

コード:

#include "../include/GV.h"

void calc_ch(){
	ch.count++;
	ch.img_num=(ch.count%24)/6;
	if(CheckKeyFrame(KEY_INPUT_LEFT)>0){
		ch.x-=3;
	}
	if(CheckKeyFrame(KEY_INPUT_RIGHT)>0){
		ch.x+=3;
	}
	if(CheckKeyFrame(KEY_INPUT_DOWN)>0){
		ch.y+=3;
	}
	if(CheckKeyFrame(KEY_INPUT_UP)>0){
		ch.y-=3;
	}
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 方向キーなど一部のキー入力が認識されない

#2

投稿記事 by softya(ソフト屋) » 12年前

これだけだと何とも言えませんが、龍神録のソースコードがダウンロード出来ますのでコンパイルして試してみてください。
(1)ダウンロードした龍神録は問題ない場合 → プログラミムのどこかにミスがあります。
(2)ダウンロードした龍神録にも問題がある場合 → OSやキーボードなどの問題の可能性があります。

問題点の切り分けです。(1)か(2)か確認をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuki1207

Re: 方向キーなど一部のキー入力が認識されない

#3

投稿記事 by yuki1207 » 12年前

龍神録のサンプルプログラムは普通に動きました。
また、char.cppの中で呼び出している自作関数CheckKeyFrameをCheckHitKey関数に直して引数にKEY_INPUT_LEFTなどを与えると
きちんと方向キーに反応してキャラクターが動くプログラムになりましたので、キーボードなどの異常ではないみたいです。
なので自作したkey.cpp内の関数に問題があると思うのですが・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 方向キーなど一部のキー入力が認識されない

#4

投稿記事 by softya(ソフト屋) » 12年前

配列の内容が何らかのバグで書き換えられている可能性はないでしょうか? → 配列の添字外アクセスやポインタのミス等。
そういう場合は、key.cpp以外の場所でバグが起きる可能性があります。
GetHitKeyFrameAllの return 0;直前のKEY_INPUT_LEFTの値は正しいか確認してみてください。
もし、GetHitKeyFrameAllでは正しくてcalc_ch()で値が変ならば別の原因となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuki1207

Re: 方向キーなど一部のキー入力が認識されない

#5

投稿記事 by yuki1207 » 12年前

すみません、あのあと一からサンプルプログラムと見比べてみたところCheckKeyFrame関数に渡していた
char型の変数Handleはサンプルではunsigned char型となっており、ここを修正したところ動きました
char型の宣言では値が-128~127しか取れないため、たまたま方向キーなどの一部のキーが128以上の値を取っていたため
きちんと格納されていなかったということなのでしょうか・・・お騒がせしてすみません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 方向キーなど一部のキー入力が認識されない

#6

投稿記事 by softya(ソフト屋) » 12年前

あっとごめんなさい見逃してました。
引数がcharでしたか。それだと狙ったとおりには動かないですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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