ページ 11

ゲームプログラミングの館において

Posted: 2008年4月11日(金) 04:08
by 管理人
「今の瞬間入力があった」ということを苦労して判定していらっしゃる方も多いのではないでしょうか。

DXライブラリにおいて、キーの入力は
「押しているか」「押していないか」しか判定できず、「どれ位押したか」は判定出来ません。
よって、どれ位押したかを判定する為の関数を作ってみました。

もしよければお使い下さい。
押している時間もカウントされるので、色々と幅広く利用できるのではないかと思います。

http://dixq.net/g/#40

Re:ゲームプログラミングの館において

Posted: 2008年4月11日(金) 13:35
by やそ
を、開発ご苦労様です(^-^)

その瞬間に入力されたかどうかのチェックって直前の状態を必要とするので以外にアルゴリズムが気づきにくいのかな?

でも確かに需要のありそうなユーティリティですね。
検証というほどではないですが、ずーーーーーーっと押しっぱなしだった場合どのくらいの時間でオーバーフローします?
良くオンラインゲームで寝落ちする人なので、そういうアホなことが気になったりします(笑)

FPSで処理を管理していて、60FPSごとに1回通るループでチェックするならint型が4バイトの処理系なら問題ナシでしょうけどね。
FPS管理をしない、CPU性能に依る場合、CPU性能が高いほどオーバフローの危険性が増しますね。
ふつうにこのサイトでお勉強している型にはFPS管理しない天邪鬼な人なんていないか(^^ゞ

Re:ゲームプログラミングの館において

Posted: 2008年4月11日(金) 16:57
by 管理人
そうですね~。確かに、リフレッシュに同期しないと、すごい早さで加算されてしまう可能性も・・。
60FPSならオーバーフローするまでに、1年位かかると思うので大丈夫だと思ったんですが、

if(押されていたら)
 if(値+1がint型の扱える範囲内なら)
   加算;

とするべきでしょうかね?
別にライブラリでもなければ、初心者用HPなので、厳密さよりわかりやすさ重視の方がいいとはおもいますが^^;

Re:ゲームプログラミングの館において

Posted: 2008年4月11日(金) 21:59
by Justy
 えーと、気になったのですが、仕様として以下の文言を追加しておく必要はないでしょうか?

・ 引数 KeyStateBufには毎回同じバッファを指定すること
・ 最初に使うときは KeyStateBufを全て0初期化しておくこと。

 この2点が守られないと期待通りの動作をしないと思います。


>リフレッシュに同期しないと、すごい早さで加算されてしまう可能性も・・
 本家と同じように、最後に呼ばれた時間を調べて・・・、ということをすれば
防げますが、複雑になりそうですね。

 範囲チェックも本当はした方がいいのでしょうが、limits.h/climitsのインクルードを
しないと intの最大値がわからない、というのも初心者向けではないでしょうし・・・。

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 01:46
by 管理人
Justyさん、アドバイスありがとうございます。
そうですね、その注意は必要ですね。

int型の最大値はsizeof(int)から計算出来ないのでしょうか?

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 02:33
by Justy
>int型の最大値はsizeof(int)から計算出来ないのでしょうか?
 あー、現実的には可能ですね。

 この関数自体が DXライブラリに依存している関係上、
当然環境は x86+Windows、しかもコンパイラまで限られるので、
sizeof(int)の結果による決め打ちはできそうです。

 ただ、言語的には1バイトが 8bitとは限らないですし、sizeof(int)の中に
詰め物ビットがあるかもしれないので、難しいです。

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 03:04
by 管理人
>言語的には1バイトが 8bitとは限らないですし

え、そうなんですか?!
それはコンパイラに依存するのでしょうか?

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 03:17
by 木霊
 以前、たかぎさんが2、3回こちらの掲示板でもレスされていましたよ。
 確か

「C言語の規格でchar型が1byteとは決まっているが、char型が8bitとは決まっていない。
   現実にchar型が9bitのコンパイラも存在する」

 だったような・・・

 うろ覚えで申し訳ないですが、コンパイラ依存みたいです。

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 03:26
by Justy
>それはコンパイラに依存するのでしょうか?
 コンパイラというか対象のCPU、メモリ、コンパイラなど全てを含めた環境に
依存してます。
 その為に CHAR_BITという定数があるわけで。

 実際9というのは実在しますし、ひょっとしたら自由にビット数を
変更できるのとかあるかもしれません。
(ソフトウェアで仮想的に作られた CPUならありそう)

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 05:14
by 管理人
>木霊さん
>Justyさん

なるほど、そうだったのですか、勉強になりました、ありがとうございますm(_ _)m

Re:ゲームプログラミングの館において

Posted: 2008年4月12日(土) 13:24
by tk-xleader
>管理人さん

static変数を使ったほうが、より直感的な動作になると思います。
実装例としては、こんな感じです。
int GetHitKeyStateAll_3(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        static int NowTotalKeyStateBuf[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) NowTotalKeyStateBuf++;
                else                            NowTotalKeyStateBuf=0;
        }
        memcpy(KeyStateBuf,NowTotalKeyStateBuf,sizeof(NowTotalKeyStateBuf));
        return 0;
}

こうすれば毎回違うバッファを指定したところで、誤動作せずにしっかりと入れてくれます。引数バッファを初期化をする必要性すらありません。

Re:ゲームプログラミングの館において

Posted: 2008年4月13日(日) 01:19
by 管理人
そうですね。
こちらのほうがよりよいですね、ありがとうございます。