トップページ > 過去ログ > 記事閲覧
キー同時入力
名前:がらんどー 日時: 2011/03/15 23:47

「14歳から始めるC言語」で サンプルでアクションゲームを作ろうとしています。 しかし、chap3のキャラを動かす際に キーを同時入力(全く同時押しではなく、 右を押す→右を押しっぱなしで左を押す)の時、 後から押された方へ移動させようと思いました。 (本の方は解決策無し) そこで以下のソースを書いたら ウィンドウは開くのですが、 全く動かず応答無し状態になってしまいました。 すいませんが、 原因と解決法を教えていただけませんでしょうか。 ↓以下ソースです。 #include "myhelper.h" #include "mymain.h" #include "stdio.h" //Pキャラのデータ Point2D g_jikipos = {40,400}; //Pキャラの座標 //画像ハンドル指定 int g_jikiimage[11]; //メインループ void MyMain(){ Vector curvec1 = {0,0}; char keybuf [256]; int left_key_state = 0; int right_key_state = 0; int old_left_key_state = 0; int old_right_key_state = 0; int press_key = 0; int PUSH = 0; int RELEASE = 1; int NONE = 2; GetHitKeyStateAll( keybuf ) ; while(ProcessMessage() == 0 && 1) { old_left_key_state = left_key_state; //現フレームのキー状態をold_left_key_stateに入れる old_right_key_state = right_key_state; //同じく右キー状態を if(keybuf[KEY_INPUT_LEFT] == 1){ left_key_state = PUSH; }//左キーチェック 押されている→「PUSH」違う場合は 「RELEASE」を代入 else{ left_key_state = RELEASE; } if(keybuf[KEY_INPUT_RIGHT] == 1){ right_key_state = PUSH; } //同じく右キーを else{ right_key_state = RELEASE; } if(left_key_state == PUSH && right_key_state == RELEASE) curvec1 = AddVector( curvec1 , LEFTMOVEC);{ press_key = KEY_INPUT_LEFT; }//左PUSH 右RELEASEのとき キーは左 if(left_key_state == RELEASE && right_key_state == PUSH) curvec1 = AddVector( curvec1 , RIGHTMOVEC); { press_key = KEY_INPUT_RIGHT; } //同じく 右がPUSH if(left_key_state == RELEASE && right_key_state == RELEASE){ press_key = NONE; } //両方RELEASEの場合 キーは無し if(left_key_state == PUSH && right_key_state == PUSH){ if(left_key_state == PUSH && old_left_key_state == RELEASE) curvec1 = AddVector( curvec1 , LEFTMOVEC);{ press_key = KEY_INPUT_LEFT; }//今  左が押されている から引く 前 左が押されていない を キーは左 if(right_key_state == PUSH && old_right_key_state == RELEASE) curvec1 = AddVector( curvec1 , RIGHTMOVEC);{ press_key = KEY_INPUT_RIGHT; }// 同じく→ } } //Pキャラ座標計算 g_jikipos = AddVectorInFrameTime(g_jikipos,curvec1); //Pキャラ描画 DrawAnimation(g_jikipos.x , g_jikipos.y, 1 , 0 , FALSE , &g_jikiimage[2] , 6 , 12); } //ファイル読み込み int LoadFiles(){ //画像読み込み if (LoadDivGraph("media\\player01.bmp",11,11,1,64,64,g_jikiimage) == -1) return -1; return 1; } いじっているのはwhile文のみなので、 他には問題ないです(本のママ)

Page: 1 |

Re: キー同時入力 ( No.1 )
名前:埴輪 日時:2011/03/16 08:24

GetHitKeyStateAll()がループの外にあるので、 キー状態取得が1度しか行われていないと思います。
Re: キー同時入力 ( No.2 )
名前:がらんどー 日時:2011/03/16 17:56

埴輪さん とりあえずループ内に入れてみましたが、 やはりウィンドウは開くものの、 何の反応もありません。 キャラが動かないという事では無く、 そもそも表示すらされない状態です。 ウィンドウの名前もDXlib(応答なし)になります。 尚、本のサンプル文の時は問題無く動作したので、 やはりコードを弄ったココが原因なんでしょうが、 どうもよく分かりません。 初心者で申し訳ありません。
Re: キー同時入力 ( No.3 )
名前:いっち 日時:2011/03/16 18:53

DrawAnimation関数が ProcessMessage のループの外にあるためではないでしょうか。 それ以外にも if と文の対応が怪しいです。慣れないうちはインデントをきっちりつけた方が良いと思います。
Re: キー同時入力 ( No.4 )
名前:がらんどー 日時:2011/03/16 23:58

ループ内にSetDrawScreen,ClsDrawScreen, ScreenFlipを入れると表示されました。 しかし次はキャラがものすごい勢いで移動しました。 更にキーを離しても停止せず、 そのまま歩いていってしまいました。 押しっぱなしで加速している気もします。 本にはAddVectorInFrameTimeを使うと書いていますが、前のソースの通り使用しています。 一応現在のソースを再び載せときます //メインループ void MyMain(){ Vector curvec1 = {0,0}; char keybuf [256];//これポインタ int left_key_state = 0;//ここから変数定義 int right_key_state = 0; int old_left_key_state = 0; int old_right_key_state = 0; int press_key = 0; int PUSH = 0; int RELEASE = 1; int NONE = 2; while(ProcessMessage() == 0 && 1){ SetDrawScreen( DX_SCREEN_BACK );//描画対象を裏に GetHitKeyStateAll( keybuf ) ;//全てのキーを確認する old_left_key_state = left_key_state; //現フレームのキー状態をold_left_key_stateに入れる old_right_key_state = right_key_state; //同じく右キー状態を if(keybuf[KEY_INPUT_LEFT] == 1){ left_key_state = PUSH; }//左キーチェック 押されている→「PUSH」違う場合は 「RELEASE」を代入 else{ left_key_state = RELEASE; } if(keybuf[KEY_INPUT_RIGHT] == 1){ right_key_state = PUSH; }//同じく右キーを else{ right_key_state = RELEASE; } if(left_key_state == PUSH && right_key_state == RELEASE) curvec1 = AddVector( curvec1 , LEFTMOVEC);{ press_key = KEY_INPUT_RIGHT; }//左PUSH 右RELEASEのとき キーは左 if(left_key_state == RELEASE && right_key_state == PUSH) curvec1 = AddVector( curvec1 , RIGHTMOVEC); { press_key = KEY_INPUT_LEFT; } //同じく 右がPUSH if(left_key_state == RELEASE && right_key_state == RELEASE){ press_key = NONE; } //両方RELEASEの場合 キーは無し if(left_key_state == PUSH && right_key_state == PUSH){ if(left_key_state == PUSH && old_left_key_state == RELEASE) curvec1 = AddVectorInFrameTime( curvec1 , LEFTMOVEC);{ press_key = KEY_INPUT_LEFT; }}//今  左が押されている から引く 前 左が押されていない を キーは左 if(right_key_state == PUSH && old_right_key_state == RELEASE) curvec1 = AddVectorInFrameTime( curvec1 , RIGHTMOVEC);{press_key = KEY_INPUT_RIGHT; }// 同じく→ //画面消去 ClsDrawScreen(); //Pキャラ座標計算 g_jikipos = AddVectorInFrameTime(g_jikipos,curvec1); //Pキャラ描画 DrawAnimation(g_jikipos.x , g_jikipos.y, 1 , 0 , FALSE , &g_jikiimage[2] , 6 , 12); //画面切り替え ScreenFlip(); } } //ファイル読み込み int LoadFiles(){ //画像読み込み if (LoadDivGraph("media\\player01.bmp",11,11,1,64,64,g_jikiimage) == -1) return -1; return 1; } メインループより上は弄っていないので、省きました。
Re: キー同時入力 ( No.5 )
名前:T 日時:2011/03/17 00:45

いっちさんも仰っていますが、インデントはしっかりしましょう 直すべきところは SetDrawScreen はループに入れる必要はない PUSH, RELEASE, NONE は変数ではなく定義(#define)に ifの{}をしっかりと見直す の3点です まあプログラム自体はifの絡みだけ修正すれば動きますが…
Re: キー同時入力 ( No.6 )
名前:埴輪 日時:2011/03/17 08:28

あまり関係ないでしょうが、 while(ProcessMessage() == 0 && 1){ の && 1 は必要でしょうか
Re: キー同時入力 ( No.7 )
名前:がらんどー 解決 日時:2011/03/17 17:59

Tさん すいません、インデントの意味が分からず聞き流してました。ちゃんと付ける様にします。 あと色々間違いを指摘して下さりありがとうございます。実はちゃんと理解しないまま使ってました。 ちゃんとリファレンスも読んできます。 埴輪さん 自分は理解していないので言い切れませんが、 おそらく間違いだと思います。 とりあえず1入れれば 無限ループになると聞きまして。 必要無いようなので消してきます。 皆さんいろいろアドバイスありがとうございます。 多分もう大丈夫だと思いますので後は頑張ってきます。

Page: 1 |