🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

4748閲覧

dxlib キー入力で押した時と押されている間を実装したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2021/02/16 02:06

編集2021/02/16 02:44

提示コードですがここからどうすればキーが押された時と押されている間の取得出来るのでしょうか?それぞれを関数化したいです。
実装方法を含めどうしたらいいかわからないです。どうすればいいのでしょうか?

参考サイト 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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/02/16 02:25

> どうすればキーが押された時と押されている間の取得出来るのでしょうか?それぞれを関数化したいです。 このままでは単なる作業依頼です。まず考えて自分で実装してください。1フレームごとにgpUpdateKey()を呼ぶとして、キーが押されている間、キーごとのtmpKeyの各要素がインクリメントされ続けるのですから、そこから判断することができるはずです。ただし、安易にインクリメントし続けると、255から0になったときに判断を誤ることになります。
退会済みユーザー

退会済みユーザー

2021/02/16 02:29

なるほど。わかりました。
dodox86

2021/02/16 02:33

> tmpKeyの各要素がインクリメントされ続けるのですから、 この点、誤りのある記述でした。tmpKeyは単なるチェック用で、インクリメントはkey[]の方で行う操作ですね。
dodox86

2021/02/16 02:36

[2021/02/16 11:32]の質問の編集を読んで: > 実装方法を含めどうしたらいいかわからないです。どうすればいいのでしょうか? ...そう来ましたか。(汗) この質問に限らないのですが、もはや、自ら考えることを放棄してませんか?
退会済みユーザー

退会済みユーザー

2021/02/16 02:38

よく考えたのですがどうしたらいいのでしょうか?本当にどうしたらいいかわからないのです。、
dodox86

2021/02/16 02:44

「DXライブラリ」のタグはあるので、追加した方が良いと思います。
fana

2021/02/16 03:00

方法論がわからないのに gpUpdateKey() とか Key[256]; とかいう実装を持ってくる,その行動の意味がわからない. 使い方が不明なコードを何故かどこぞからパクって,パクり元とは別の所で「わからん」とか……
dodox86

2021/02/16 03:17

(fanaさんの指摘を読んで)もしかすると、そもそもDXライブラリが提供するGetHitKeyStateAll()関数と、それを利用した自作関数であるgpUpdateKey()がどういう働きをしているか理解されていない、ということでしょうか。もしそうだとすると、コードを提示しても恐らく理解できないですね。(コピッて終わり)
退会済みユーザー

退会済みユーザー

2021/02/16 03:30

質問ですがクラスにしても間違えではないのでしょうか?
dodox86

2021/02/16 03:55 編集

C++でクラス化しようがC言語の関数であろうが、適切に、要望の動きができれば別に間違えではないと思いますが、クラス化するかどうかは解決の本質ではないと思います。
kazuma-s

2021/02/16 08:10 編集

> キーが押されている間、キーごとのtmpKeyの各要素がインクリメントされ続けるのですから、そこから判断することができるはずです。ただし、安易にインクリメントし続けると、255から0になったときに判断を誤ることになります。 インクリメントされるのは、char の tmpKey[i] ではなく、int の Key[i] ですから、 4294967296/60秒 = 828.5日 推し続けないと 0 になりません。
dodox86

2021/02/16 05:06

>@kazuma-sさん ご指摘のとおりですね。Key[]の方の型を見誤っていました。どうもありがとうございます。
fana

2021/02/16 05:07

押され続けた時間の長さに関する情報の取得が不要ならば, ・前回の状態(押されてたかどうか) ・今回の状態 だけあればよいわけで. 256種類のキーを扱う必要があるとしても,覚えとく情報は256bit(=32byte)で済む話. そこに800日稼働できるカウンタを用意するという発想自体がそもそもどうかしてる感.
guest

回答1

0

ベストアンサー

以下のコードにより実装、解決しました。クラスにすることにしました。
落ち着いて思考して理解出来ました。

ボタンを押している間のコードはそんなに長い間押していることないため取り得ずint 型にしました。

cpp

1#include "Input.hpp" 2 3// コンストラクタ 4Input::Input() 5{ 6 //キー状態配列を初期化 7 for (int i = 0; i < 256; i++) 8 { 9 Key[i] = 0; 10 } 11} 12 13//キー入力状態を更新 14void Input::Update() 15{ 16 char tmpKey[256]; // 現在のキーの入力状態を格納する 17 GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る 18 for (int i = 0; i < 256; i++) { 19 if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら 20 Key[i]++; // 加算 21 } 22 else { 23 // 押されていなければ 24 Key[i] = 0; // 0にする 25 } 26 } 27} 28 29//キーを押した時だけ 30bool Input::getKeyDown(unsigned char KeyCode) 31{ 32 if (Key[KeyCode] == 1) 33 { 34 return true; 35 } 36 else 37 { 38 return false; 39 } 40} 41 42//キーを押している時 43int Input::getKeyDownHold(unsigned char KeyCode) 44{ 45 return Key[KeyCode]; 46} 47 48// デストラクタ 49Input::~Input() 50{ 51 52} 53 54

hpp

1#ifndef ___INPUT_HPP_ 2#define ___INPUT_HPP_ 3 4#include "dxlib.h" 5 6class Input { 7 8public: 9 Input(); //コンストラクタ 10 ~Input(); //デストラクタ 11 12 void Update(); //キー入力状態を更新 13 14 bool getKeyDown(unsigned char KeyCode); //キーが押された瞬間だけ 15 int getKeyDownHold(unsigned char KeyCode); //キーが押されている間 16 17private: 18 int Key[256]; //キー状態 19 20}; 21 22 23 24#endif 25

cpp

1#include "Player.hpp" 2 3//コンストラクタ 4Player::Player() : Actor() 5{ 6 Sprite = LoadGraph("Assets/Player.png"); 7 input = std::make_shared<Input>(); 8} 9 10 11 12//計算 13void Player::Update() 14{ 15 input->Update(); 16} 17 18//描画 19void Player::Draw() 20{ 21 if (input->getKeyDownHold(KEY_INPUT_LEFT) > 0) { 22 DrawGraph(100, 100, Sprite, true); 23 printf("ああああ\n"); 24 } 25 else 26 { 27 printf("いいいいい\n"); 28 } 29} 30 31 32

投稿2021/02/16 04:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問