DXライブラリ GetHitKeyStateAll について

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: DXライブラリ GetHitKeyStateAll について

Re: DXライブラリ GetHitKeyStateAll について

#5

by はかた » 5年前

==に変えたら上手くいきました!
本当に助かりました。ありがとうございます。

Re: DXライブラリ GetHitKeyStateAll について

#4

by Math » 5年前

>というプログラムの10行目 if( tmpKey != 0 ) の条件式を tmpkey = 1 にすると右キーを押しても反応せず、最初の位置も変わりました。
GetHitKeyStateAll関数での()の中身は押されていたら1、押されていなければ0なので != 0 も = 1 も同じような気がするんですが、なぜ上手くいかないんでしょうか?
ーーーーー
10行目は
if( tmpKey[ i ] != 0 ){ // i番のキーコードに対応するキーが押されていたら
ですから
if( tmpKey[ i ] == 1 ){ // i番のキーコードに対応するキーが押されていたら

の勘違いでしょう(^^;  そのようににしたら”正常” に動作しますよ。

***
チェック付きプログラム

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] == 1 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

  int Color; Color = GetColor( 255 , 255 , 255 ) ;


        int x=0;

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

                DrawFormatString( x, 0, GetColor(255,255,255), "?!" ); // x,0 の位置に白で ?! を描画

                if( Key[KEY_INPUT_RIGHT] == 1 ){ // 右キーが押された瞬間なら
                        x = x + 50;                 // xを50加算
                }



  DrawFormatString( 0, 30, Color, "KEY_INPUT_RIGHT=%d: ", KEY_INPUT_RIGHT) ;

  for( int i=65; i<256; i++ ){ DrawFormatString( 70*((i-65) % 8), 20*((i-65)/8) + 60, Color, ":%d=%d: ", i ,Key[i]) ; }



        }

        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 
実行する。
http://www2.koyoen.birdview.co.jp/~abcx ... -03-a-.PNG

キーを押しているとカウント・アップします。

Re: DXライブラリ GetHitKeyStateAll について

#3

by あたっしゅ » 5年前

DxLib で DrawFormatString で出力してみたら、1 でした。ワイの仮説は、間違っていました。

>というプログラムの10行目 if( tmpKey != 0 ) の条件式を tmpkey = 1 にすると右キーを押しても反応せず、最初の>位置も変わりました。

よく見てみたら、「tmpkey = 1」だと代入だよ。「tmpkey == 1」にしないと、という問題かな ?

Re: DXライブラリ GetHitKeyStateAll について

#2

by あたっしゅ » 5年前

即レス優先モードです。

「押されていたら1、押されていなければ0」という資料が間違っているんじゃないですか ?
実際は、「押されていたら 0x80、押されていなければ0」とかであるので、「!=0」で判定していたから、問題にならなかったとか。

tmpKeyの内容を出力してみれば、けりがつくと思います。

DXライブラリ GetHitKeyStateAll について

#1

by はかた » 5年前

プログラム初心者です。レベルが低い質問になると思いますが、調べても理解できなかったことがあるので質問させていただきます。
当サイト2.9章 全てのキーの入力状態を取得する の内容で、

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

        int x=0;

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

                DrawFormatString( x, 0, GetColor(255,255,255), "?!" ); // x,0 の位置に白で ?! を描画

                if( Key[KEY_INPUT_RIGHT] == 1 ){ // 右キーが押された瞬間なら
                        x = x + 50;                 // xを50加算
                }

        }

        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 
というプログラムの10行目 if( tmpKey != 0 ) の条件式を tmpkey = 1 にすると右キーを押しても反応せず、最初の位置も変わりました。
GetHitKeyStateAll関数での()の中身は押されていたら1、押されていなければ0なので != 0 も = 1 も同じような気がするんですが、なぜ上手くいかないんでしょうか?

ページトップ