質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

3420閲覧

なぜかDirectX11のキーの入力処理がうまくいかない...

UE4benkyo-

総合スコア37

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/06/07 13:01

編集2021/06/12 03:11

こんにちは。DirectX11のキー入力で離されたときを取得したいのですがなぜか処理が通りません。

押した瞬間は処理が通っているのが確認できるのですが
上キーの離した瞬間がなぜかブレークポイントを置いても処理が通っていません。
なんでですかね?
wikiを見て書きましたがもし書き方が間違っていたら教えてもらえるとありがたいです。

wikiのリンクです。

リンク内容

h

1 2DirectX::SimpleMath::Vector3 mPos; 3

cpp

1Keyboard::KeyboardStateTracker tracker; 2 3auto keyState = DirectX::Keyboard::Get().GetState(); 4tracker.Update(keyState);
キーの入力処理 // 右キーが押されたとき if (tracker.IsKeyPressed(DirectX::Keyboard::Right)) { mPos.x += 0.01f; } // 左キーが押されたとき if (tracker.IsKeyPressed(DirectX::Keyboard::Left)) { mPos.x -= 0.01f; } // 下キーが押されたとき if (tracker.IsKeyPressed(DirectX::Keyboard::Down)) { mPos.z -= 0.01f; } // 上キーが離されたとき if (tracker.IsKeyReleased(DirectX::Keyboard::Up)) { mPos.z += 0.01f; }

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

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

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

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

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

vann_2921

2021/06/13 15:07

since the previous Update. とあるので、2回目以降のtracker.Update(keyState);が必要なのではないでしょうか? もしかしてtracker.Update(keyState);をメインループの外側に書いていないでしょうか?
yukkuri_55

2021/06/14 05:20

// 上キーが離されたとき if (tracker.IsKeyReleased(DirectX::Keyboard::Up)) { mPos.z += 0.01f; } コメントに離されたときとありますが、これは押されたときではないでしょうか?
yukkuri_55

2021/06/14 05:20

IsKeyReleased ですね、すいません。
UE4benkyo-

2021/06/16 14:12 編集

vann_2921さん Update関数のの中にに書いていますのでそこは大丈夫だと思います。
UE4benkyo-

2021/06/16 14:11

yukkuri_55さん 全然大丈夫です。
guest

回答2

0

自己解決

無事解決しました。
原因はメンバ変数にしていなかったからでした。

今まではローカル変数として使っていて、
ボタンを押す場合はそれでもよかったのですが、

離すときはそもそもローカル変数なので、次のループまで
押しているのを保持できなかったからだと思います。

同じような境遇の人のために
コードを書いておきます。

h

1#include <keyboard.h> 2 3// キートラッカー 4std::unique_ptr<DirectX::Keyboard::KeyboardStateTracker> mKeyTracker; 5 6 7
cpp 初期化関数() { // キートラッカーの生成 mKeyTracker = std::make_unique<DirectX::Keyboard::KeyboardStateTracker>(); } 更新関数() { // キー入力情報を取得する auto keyState = DirectX::Keyboard::Get().GetState(); // トラッカーの更新 mKeyTracker->Update(keyState); // Spaceボタンが押された瞬間 if (mKeyTracker.IsKeyPressed(DirectX::Keyboard::Space)) { } }

投稿2021/06/27 05:17

UE4benkyo-

総合スコア37

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

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

0

こんにちは。同じ、DirectX11を使っている者です。初心者マークがついていたので仲間ですね。
ボタンの入力の種類として、プレス(Press)、トリガー(trigger)、リリース(release)、リピート(repeat)があります。それぞれ、プレス(ボタンを押しているかいないか)、トリガー(ボタンを押した瞬間かどうか)、リリース(ボタンを離した瞬間)、リピート(数フレームに1回だけ反応する)があります。プレスはプレイヤーの移動などに使い、トリガーは弾の発射などに使います。質問者様のプログラムを見ると、上キーが離されたとき、Releasedになっています。これはあっています。DirectX11のキー入力で離されたときを取得したいということなので、方向キーの処理を全てリリースにしてみたらどうでしょうか。2種類のキー入力方法を試したいのなら話は別ですが。

C++

1キーの入力処理 2// 右キーが離されたとき 3if (tracker.IsKeyReleased(DirectX::Keyboard::Right)) 4{ 5 mPos.x += 0.01f; 6} 7 8// 左キーが離されたとき 9if (tracker.IsKeyReleased(DirectX::Keyboard::Left)) 10{ 11 mPos.x -= 0.01f; 12} 13 14// 下キーが離されたとき 15if (tracker.IsKeyReleased(DirectX::Keyboard::Down)) 16{ 17 mPos.z -= 0.01f; 18} 19// 上キーが離されたとき 20if (tracker.IsKeyReleased(DirectX::Keyboard::Up)) 21{ 22 mPos.z += 0.01f; 23}

投稿2021/06/26 18:17

isimasa

総合スコア308

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

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

UE4benkyo-

2021/06/27 05:18

回答ありがとうございます! 同じ仲間がいたなんてうれしいです。 そのあといろいろやってみてもしかしてと思い 結果わかったので自己解決のところに書くのでよかったら見ていってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問