DXライブラリ GetHitKeyStateAll について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はかた
記事: 2
登録日時: 2ヶ月前

DXライブラリ GetHitKeyStateAll について

#1

投稿記事 by はかた » 2ヶ月前

プログラム初心者です。レベルが低い質問になると思いますが、調べても理解できなかったことがあるので質問させていただきます。
当サイト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 も同じような気がするんですが、なぜ上手くいかないんでしょうか?

アバター
あたっしゅ
記事: 241
登録日時: 8年前
住所: 東京23区
連絡を取る:

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

#2

投稿記事 by あたっしゅ » 2ヶ月前

即レス優先モードです。

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

tmpKeyの内容を出力してみれば、けりがつくと思います。
手提鞄あたっしゅ、[MrAtassyu] http://atassyu.rosx.net/
手提鞄屋魚有店(てさげかばんやうおありてん)
2019(R01)-05-12(日) Comitia 128 青海新会場は、落選しました。
2019(R01)-06-02(日) MGM2.26 板橋区立グリーンホールは、一般参加予定。

アバター
あたっしゅ
記事: 241
登録日時: 8年前
住所: 東京23区
連絡を取る:

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

#3

投稿記事 by あたっしゅ » 2ヶ月前

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

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

よく見てみたら、「tmpkey = 1」だと代入だよ。「tmpkey == 1」にしないと、という問題かな ?
手提鞄あたっしゅ、[MrAtassyu] http://atassyu.rosx.net/
手提鞄屋魚有店(てさげかばんやうおありてん)
2019(R01)-05-12(日) Comitia 128 青海新会場は、落選しました。
2019(R01)-06-02(日) MGM2.26 板橋区立グリーンホールは、一般参加予定。

Math

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

#4

投稿記事 by Math » 2ヶ月前

>というプログラムの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

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

はかた
記事: 2
登録日時: 2ヶ月前

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

#5

投稿記事 by はかた » 2ヶ月前

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

返信

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