GetHitKeyStateAll_2とCheckStateKey

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

GetHitKeyStateAll_2とCheckStateKey

#1

投稿記事 by kiri » 15年前

GetHitKeyStateAll_2とCheckStateKey関数のことをちゃんと理解できていないので、いくつか質問したいです。

・3章にあるように、「キー情報の値が不正に書き換えられる危険性」というのはどういった場合があるのでしょうか?
・GetHitKeyStateAll_2は、常にメインループで呼ばれていて、その上でなにかしらのキーが入力されたらCheckStateKeyが呼ばれるんですよね?だとしたら、どういった順序で関数に値が渡っているのかがいまいち分からないです。
CheckStateKey(KEY_INPUT_ESCAPE)←ESCAPEが入力された
↓
int CheckStateKey(unsigned char Handle){←Handleはなぜchar型で、値はいくつになるのでしょうか?
        return stateKey[Handle];
}
GetHitKeyStateAll_2()はどのタイミングで呼ばれるのでしょうか?

説明が下手で恐縮ですが分かづらいところがあれば指摘をお願いします。
よろしくお願いします。

fatens

Re:GetHitKeyStateAll_2とCheckStateKey

#2

投稿記事 by fatens » 15年前

>3章にあるように、「キー情報の値が不正に書き換えられる危険性」というのはどういった場合があるのでしょうか?
2章においてKey[/url]はグローバル変数なので、例えばWinMain 関数内で書き換えることができます。

>GetHitKeyStateAll_2 は、常にメインループで呼ばれていて、その上でなにかしらのキーが入力されたらCheckStateKeyが呼ばれるんですよね?
CheckStateKey 関数は自分で呼び出さない限り呼ばれません。

>Handleはなぜchar型で、値はいくつになるのでしょうか?
Handleはunsigned char型ですね。
値はヘッダファイルで定められています。
KEY_INPUT_ESCAPEの場合は0x01です。

>GetHitKeyStateAll_2() はどのタイミングで呼ばれるのでしょうか?
WinMain 関数内の while(ProcessLoop()==0) でループしていますが、
その中のProcessLoop 関数の最後で呼ばれています。

Dixq (管理人)

Re:GetHitKeyStateAll_2とCheckStateKey

#3

投稿記事 by Dixq (管理人) » 15年前

もしかしたら「char型は文字で扱う為の方のはずなのに、何故キー番号として使っているの?」という疑問でしょうか。
DXライブラリはDirectXの複雑さをなるべく無くそうとしてあるライブラリです。
DirectXは独自の定義のオンパレードなので、初めてみるとわけがわからなく感じます。
そこで、DXライブラリはなるべく、見た事があるような型だけで実装してあります。

int, char, float, double位しか出てこないですよね。

そして、キーの番号はintで計算出来る整数型ですが、
256種類しかないので、4バイトも必要ありません。unsigned charで十分です。

そこで、DXライブラリではunsigned charをキー番号を入れる型として使っているわけです。

キー番号がいくつになっているかは、ヘッダファイルを見るといいですよ。
たとえば

KEY_INPUT_ESCAPE

と書いた上で、右クリック>定義に移動、さらに定義に移動すると値を見る事が出来ます。

kiri

Re:GetHitKeyStateAll_2とCheckStateKey

#4

投稿記事 by kiri » 15年前

>「char型は文字で扱う為の方のはずなのに、何故キー番号として使っているの?」という疑問
指摘されている通りそのことが知りたかったんです。説明不足でした。
char型=文字しか扱わないと思っていました。

お二人の回答とリファレンスページを何度か読み返すなどして、なんとなく理解することができました。
ありがとうございます。

また、関連して、GetHitMouseStateAll_2関数をGetHitKeyStateAll_2とCheckStateKey関数のように使用するにはどうしたらいいのでしょうか?

fatens

Re:GetHitKeyStateAll_2とCheckStateKey

#5

投稿記事 by fatens » 15年前

>また、関連して、 GetHitMouseStateAll_2関数をGetHitKeyStateAll_2とCheckStateKey関数のように使用するにはどうしたらいいのでしょうか?
それは、 GetHitMouseStateAll_2 関数を自分で作りたいということでしょうか?
GetHitKeyStateAll_2 関数は管理人さんが作られたもので、DXライブラリの関数ではありません。

kiri

Re:GetHitKeyStateAll_2とCheckStateKey

#6

投稿記事 by kiri » 15年前

えーと、そうではなくて龍神録プログラミングの館にある
//key.cpp
unsigned int stateKey[256];

int GetHitKeyStateAll_2(){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key==1) stateKey++;
        else                            stateKey=0;
    }
    return 0;
}

int CheckStateKey(unsigned char Handle){
        return stateKey[Handle];
}
を
//key.cpp
int GetHitMouseStateAll_2(Mouse_t *Nezumi){
    if(GetMousePoint( &Nezumi->x, &Nezumi->y ) == -1){ //マウスの位置取得
        return -1;
    }
    int MouseInput=GetMouseInput();    //マウスの押した状態取得
    for(int i=0; i<8; i++){            //マウスのキーは最大8個まで確認出来る
        if( (MouseInput & 1<<i ) != 0 ) Nezumi->Button++;   //押されていたらカウントアップ
        else                            Nezumi->Button = 0; //押されてなかったら0
    }
    Nezumi->WheelRotVol = GetMouseWheelRotVol() ;    //ホイール回転量取得
    return 0;
}

int CheckStateMouse(unsigned int Handle){
        return ~~~;
}

という風にmain.cppから呼んで、GetHitMouseStateAll_2関数とCheckStateMouse関数を使用したいということです。

fatens

Re:GetHitKeyStateAll_2とCheckStateKey

#7

投稿記事 by fatens » 15年前

なるほど。分かりました。

KEY_INPUT_ESCAPEなどと同じようにマウスについてもヘッダファイルで定められているのですが、
それをそのまま使うのは都合が悪いので、自分で#defineやenumで定義します。
以下は龍神録と同じようにしたものの例です。

//mouse.h
enum MOUSE_BUTTON {
MOUSE_BUTTON_1,
MOUSE_BUTTON_2,
MOUSE_BUTTON_3,
MOUSE_BUTTON_4,
MOUSE_BUTTON_5,
MOUSE_BUTTON_6,
MOUSE_BUTTON_7,
MOUSE_BUTTON_8,

MOUSE_BUTTON_MAX
};

//mouse.cpp
#include "mouse.h"

static unsigned int stateMouse[MOUSE_BUTTON_MAX];

int GetHitMouseStateAll_2()
{
//stateMouse[/url]に値を設定
}

int CheckStateMouse(MOUSE_BUTTON id){
return stateMouse[id];
}

コンパイルしてませんが、これでどうでしょうか。

Dixq (管理人)

Re:GetHitKeyStateAll_2とCheckStateKey

#8

投稿記事 by Dixq (管理人) » 15年前

もしくは
mouse.cppを作り、引数となっているMouse_t構造体をグローバル変数にして、
CheckStateMouseはMouse_t型の構造体を返してはどうでしょう。

key.cppと全く同じように倣ってやってみるといいと思います。

意味が解らなければまた聞いて下さい。

kiri

Re:GetHitKeyStateAll_2とCheckStateKey

#9

投稿記事 by kiri » 15年前

fatensさんが示された例を元に下記のようにしてみましたが合っていますか?
//mouse.cpp

int GetHitMouseStateAll_2(){
    if(GetMousePoint( &Mouse.x, &Mouse.y ) == -1){ //マウスの位置取得
        return -1;
    }
    int MouseInput=GetMouseInput();    //マウスの押した状態取得
    for(int i=0; i<8; i++){            //マウスのキーは最大8個まで確認出来る
        if( (MouseInput & 1<<i ) != 0 ) stateMouse++;//押されていたらカウントアップ
        else                            stateMouse=0;//押されてなかったら0
    }
    Mouse.WheelRotVol = GetMouseWheelRotVol() ;    //ホイール回転量取得
    return 0;
} 

int CheckStateMouse(MOUSE_BUTTON id){ 
    return stateMouse[id]; 
}


管理人さんが示された例を使った場合は、おそらくGetHitMouseStateAll_2()は上と同じでCheckStateMouse()はポインタを使用するのだと思いますが、どういった書き方(?)になるのかが分からないです。
int CheckStateMouse(Mouse_t *p){ 

}

fatens

Re:GetHitKeyStateAll_2とCheckStateKey

#10

投稿記事 by fatens » 15年前

>fatensさんが示された例を元に下記のようにしてみましたが合っていますか?
CheckStateMouse(MOUSE_BUTTON_1)
などとして思った通りの値が得られているのであれば大丈夫です。


私の例はマウスのボタンしか考えてなかったので、
マウスの座標なども扱うのであれば管理人さんの案のほうが良いですね。
ただ、CheckStateMouse 関数が返すのはstateMouseへのポインタで。
その場合は以下のような感じになるのではないでしょうか。
またコンパイルはしてませんが。

//mouse.cpp
static Mouse_t stateMouse;

int GetHitMouseStateAll_2()
{
//...
}

Mouse_t *CheckStateMouse()
{
return &stateMouse;
}

//使う側
Mouse_t *mouse = CheckStateMouse();
if (mouse->Button[0] > 0)
//...

kiri

Re:GetHitKeyStateAll_2とCheckStateKey

#11

投稿記事 by kiri » 15年前

Mouse_t *mouse = CheckStateMouse();

は使用する関数内で宣言するしかないのでしょうか?
いろいろなところで使うと思うのでグローバル変数としたいのですが

GLOBAL Mouse_t *mouse = CheckStateMouse();

としてみたのですが、エラーが出てしまいます。

fatens

Re:GetHitKeyStateAll_2とCheckStateKey

#12

投稿記事 by fatens » 15年前

>いろいろなところで使うと思うのでグローバル変数としたいのですが
グローバル変数にするのであればそもそもCheckStateMouse 関数は不要で、
GLOBAL Mouse_t mouse;
として、GetHitMouseStateAll_2 関数をGetHitKeyStateAll_2 関数と同じようにメインループで毎回呼び出し、
状態を知りたいときは直接mouse.xなどにアクセスすれば良いです。

>GLOBAL Mouse_t *mouse = CheckStateMouse();
>としてみたのですが、エラーが出てしまいます。
main.cppではGLOBALが削除され、mouseは定義になります。
main.cpp以外ではGLOBALはexternに置き換わりますが、初期化子を伴っているので定義とみなされます。
そのため同名のグローバル変数が存在し、エラーになるのではないでしょうか。

kiri

Re:GetHitKeyStateAll_2とCheckStateKey

#13

投稿記事 by kiri » 15年前

>グローバル変数にするのであればそもそもCheckStateMouse 関数は不要
そうだったのですか・・・
GetHitKeyStateAll_2()関数と同じで、「キー情報の値が不正に書き換えられる危険性」があるものと思いCheckStateMouse()関数のようなものを使うのだと思っていました。

いろいろと勉強になりました。
fatensさん管理人さん、丁寧に教えて頂きありがとうございました。

閉鎖

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