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

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

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

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

Q&A

解決済

2回答

1277閲覧

glfwを使ってテキスト入力を行いたい。

退会済みユーザー

退会済みユーザー

総合スコア0

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

0グッド

0クリップ

投稿2021/05/26 10:58

編集2021/06/21 02:43

提示コードですがchrはVectorのchar型変数です。getInputChar()関数は押されたキーの値を返す関数でキーを離しても最後のキーが押された値が返ってきます。

質問内容 「 テキスト入力を行うにはどうすればいいのでしょうか?参考サイトを調べましたが三つの入力関数のうちどれを使ってもテキスト入力を実現できません。 」

参考サイト: http://ggkuron.hatenablog.com/entry/2012/05/12/090
公式リファレンス: https://www.glfw.org/docs/3.3/input_guide.html

cpp

1 2 std::vector<char> string(0); 3 char str[1000] = { '\0' }; 4 5 while (*window) 6 { 7 window->FrameUpdate(glm::vec4(0.0f, 0.0f, 0.0f, 255.0f)); 8 9 10 unsigned int n = window->getInputChar(); 11 12 std::cout << n << std::endl; 13 14 if (n != 0) 15 { 16 if (string.size() > 0) 17 { 18 string.erase(string.end() - 1); 19 string.push_back(n); 20 string.push_back('\0'); 21 22 } 23 else 24 { 25 string.push_back(n); 26 string.push_back('\0'); 27 } 28 29 n = 0; 30 } 31 32 if (string.size() > 0) 33 { 34 strcpy_s(str, string.size(), string.data()); 35 } 36 37 FrameWork::DrawFormatString(glm::vec2(100, 100), glm::vec4(0, 255, 0, 255), 100, "%s", str); 38 39 40 window->Wait(); 41 window->SwapBuffers(); 42 } 43 44 45

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/26 12:45

「 printf("%s\n", chr.data());」は何を表示するつもりなのでしょうか。 ヌル文字とかわかりますか?
退会済みユーザー

退会済みユーザー

2021/06/21 02:43

文章を修正しました。
退会済みユーザー

退会済みユーザー

2021/06/21 02:50

ヌル文字による終端以外もすでに私の回答に書いてありますが、理解できませんでしたか?
guest

回答2

0

ベストアンサー

公式リファレンスにある通りですが、「glfwSetCharCallback()」で扱うのはUnicodeのコードポイントです。
少なくとも、unsigned int型をchar型にキャストして扱えるものじゃないでしょう。
(ASCIIの範囲であれば問題ありませんが)

OpenGL_FrameWork/OpenGL_FrameWork/Window.cpp

cpp

1//コンストラクタ 2FrameWork::Window::Window(int width, int height, const char* title) 3 :window(glfwCreateWindow(width, height, title, NULL, NULL)) 4{ 5// (中略) 6 glfwSetCharCallback(window,KeyInputString); //キー入力(文字入力) 7 8 Resize(window, width, height); //リサイズ 9 10} 11 12//キー入力(文字入力) 13void FrameWork::Window::KeyInputString(GLFWwindow* win, unsigned int n) 14{ 15 16 Window* const instance = (Window*)glfwGetWindowUserPointer(win); 17 18 if (instance != NULL) 19 { 20 21 instance->inputKey = n; 22 } 23 24} 25 26//キー入力(文字入力) 27unsigned int FrameWork::Window::InputKeyBoard() 28{ 29 return inputKey; 30} 31 32 33 34

追記
とりあえず問題点だけ列挙します。
・「printf("%s\n", chr.data()」の「chr.data()」がヌル文字による終端が行われていない。
・他のキー入力が行われるまで、最後のキー入力が保持され続ける。

cpp

1void FrameWork::Window::ClearInputKeyBoard() 2{ 3 // キー入力状態クリア処理を追加 4 this->inputKey = 0; 5} 6 7void Title::Update() 8{ 9 if (windowContext->InputKeyBoard() != 0) 10 { 11 chr.push_back((char)windowContext->InputKeyBoard()); 12 13 // キー入力状態をクリア 14 windowContext->ClearInputKeyBoard(); 15 16 // 出力用に終端文字を追加 17 chr.push_back('\0'); 18 19 printf("%s\n", chr.data()); 20 21 // 出力用に追加した、終端文字を削除 22 chr.pop_back(); 23 } 24} 25

投稿2021/05/26 12:33

編集2021/06/01 06:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/26 12:38

まあ、ASCIIの範囲ならもしかしたらchar型にキャストして動く可能性があるのかもしれませんが(未確認)
退会済みユーザー

退会済みユーザー

2021/06/21 02:14

ろくに読まずにベストアンサー選んで同じ内容の質問するのやめてくれませんかね
退会済みユーザー

退会済みユーザー

2021/06/21 03:07

windowContext->ClearInputKeyBoard();の存在を見落としてました。
退会済みユーザー

退会済みユーザー

2021/06/21 03:10

質問ですが日本語入力を行う場合どういった処理を実装するのでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/21 04:17

> 質問ですが日本語入力を行う場合どういった処理を実装するのでしょうか? まず、自分で考えてください。 とりあえずあなたのコードの悪いところだけ書いておきます。 1. unsinged int型をchar型にキャストするのは不適切である。 2. IME確定時に文字数分連続してコールバックが実行されるので、現状の1文字しか保持しない形は不適切である。
guest

0

InputKeyBoard() を都合二回呼んでひとつしか push_back してないけど、それでいいんですね?
※ InputKeyboard() の実装が示されていないからこれ"だけ"が原因かはわからんですが。

投稿2021/05/26 11:17

編集2021/05/26 11:21
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問