提示コードですがここからどうすればキーが押された時と押されている間の取得出来るのでしょうか?それぞれを関数化したいです。
実装方法を含めどうしたらいいかわからないです。どうすればいいのでしょうか?
参考サイト https://www.ay3s-room.com/entry/dxlib-key-input
cpp
1#include "Input.hpp" 2 3 4 5 6static int Key[256]; 7// キーの入力状態を更新する 8int gpUpdateKey() { 9 char tmpKey[256]; // 現在のキーの入力状態を格納する 10 GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る 11 for (int i = 0; i < 256; i++) { 12 if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら 13 Key[i]++; // 加算 14 } 15 else { // 押されていなければ 16 Key[i] = 0; // 0にする 17 } 18 } 19 return 0; 20} 21 22bool getKeyDown(int keycode) 23{ 24 if (Key[keycode] == 1) 25 { 26 return true; 27 } 28 else 29 { 30 return false; 31 } 32 33}
> どうすればキーが押された時と押されている間の取得出来るのでしょうか?それぞれを関数化したいです。
このままでは単なる作業依頼です。まず考えて自分で実装してください。1フレームごとにgpUpdateKey()を呼ぶとして、キーが押されている間、キーごとのtmpKeyの各要素がインクリメントされ続けるのですから、そこから判断することができるはずです。ただし、安易にインクリメントし続けると、255から0になったときに判断を誤ることになります。
なるほど。わかりました。
> tmpKeyの各要素がインクリメントされ続けるのですから、
この点、誤りのある記述でした。tmpKeyは単なるチェック用で、インクリメントはkey[]の方で行う操作ですね。
[2021/02/16 11:32]の質問の編集を読んで:
> 実装方法を含めどうしたらいいかわからないです。どうすればいいのでしょうか?
...そう来ましたか。(汗) この質問に限らないのですが、もはや、自ら考えることを放棄してませんか?
よく考えたのですがどうしたらいいのでしょうか?本当にどうしたらいいかわからないのです。、
「DXライブラリ」のタグはあるので、追加した方が良いと思います。
方法論がわからないのに gpUpdateKey() とか Key[256]; とかいう実装を持ってくる,その行動の意味がわからない.
使い方が不明なコードを何故かどこぞからパクって,パクり元とは別の所で「わからん」とか……
(fanaさんの指摘を読んで)もしかすると、そもそもDXライブラリが提供するGetHitKeyStateAll()関数と、それを利用した自作関数であるgpUpdateKey()がどういう働きをしているか理解されていない、ということでしょうか。もしそうだとすると、コードを提示しても恐らく理解できないですね。(コピッて終わり)
質問ですがクラスにしても間違えではないのでしょうか?
C++でクラス化しようがC言語の関数であろうが、適切に、要望の動きができれば別に間違えではないと思いますが、クラス化するかどうかは解決の本質ではないと思います。
> キーが押されている間、キーごとのtmpKeyの各要素がインクリメントされ続けるのですから、そこから判断することができるはずです。ただし、安易にインクリメントし続けると、255から0になったときに判断を誤ることになります。
インクリメントされるのは、char の tmpKey[i] ではなく、int の Key[i] ですから、
4294967296/60秒 = 828.5日 推し続けないと 0 になりません。
>@kazuma-sさん
ご指摘のとおりですね。Key[]の方の型を見誤っていました。どうもありがとうございます。
押され続けた時間の長さに関する情報の取得が不要ならば,
・前回の状態(押されてたかどうか)
・今回の状態
だけあればよいわけで.
256種類のキーを扱う必要があるとしても,覚えとく情報は256bit(=32byte)で済む話.
そこに800日稼働できるカウンタを用意するという発想自体がそもそもどうかしてる感.
回答1件
あなたの回答
tips
プレビュー