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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

3回答

4596閲覧

キー入力を使い配列に入れた文字を描画させたい。

R-ogiura

総合スコア60

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/13 12:31

編集2020/02/13 14:07

環境はvisual studio 2019,DXライブラリ

行いたいこと
0. キー入力したものをローマ字で入力したい(例、a=あ、ohayou=おはよう)
0. 入力した文字を配列に入れたい
0. 配列に入れた文字を描画したい

これはキー入力のためにプログラムです。

int Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey() { char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る for (int i = 0; i < 256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; }

上のキー入力のプログラムを使って、例えば「おはよう」とローマ字で入力した文字を描画したいです。

今のところはローマ字ではないですが、半角のaを描画するところまで出来ています。
以下は全体のプログラムです。

#include "DxLib.h" int Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey() { char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る for (int i = 0; i < 256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DINPUT_JOYSTATE input; int i; SetGraphMode(1770, 1580, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 // ウインドウモードで起動 ChangeWindowMode(TRUE); // DXライブラリの初期化 if (DxLib_Init() < 0) return -1; // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // メインループ(何かキーが押されたらループを抜ける) while (ProcessMessage() == 0) { gpUpdateKey(); unsigned int Cr; // 画面のクリア ClearDrawScreen(); char mozi = 0; if (Key[KEY_INPUT_A] == 1) { // 右キーが押された瞬間なら DrawFormatString(100, 200, GetColor(255, 255, 255), "a"); } // 白色の値を取得 Cr = GetColor(255, 255, 255); // 文字列の描画 //DrawString(250, 240 - 32, "Hello C World!", Cr); // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } コード

1~3において、どう作ってよいかわかりません。どうか知恵を貸してください。
ですが、ただ教えて頂くのでは勉強にならないので、詳しい説明を付けて頂けるとありがたいです。

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

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

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

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

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

guest

回答3

0

なぜ、ChangeWindowMode と DxLib_Init と SetDrawScreen を
2回ずつ呼び出しているのですか?
意味が分かってコードを書いていますか?

次のように書けば、文字列の入力はできますが、
大文字や ! " # $ などの記号を入力することができません。
Shiftキーの処理を追加しないといけないでしょう。

C++

1#include "DxLib.h" 2 3struct key_table { int key; char val; } table[] = { 4 { KEY_INPUT_A, 'a' }, { KEY_INPUT_B, 'b' }, { KEY_INPUT_C, 'c' }, 5 { KEY_INPUT_D, 'd' }, { KEY_INPUT_E, 'e' }, { KEY_INPUT_F, 'f' }, 6 { KEY_INPUT_G, 'g' }, { KEY_INPUT_H, 'h' }, { KEY_INPUT_I, 'i' }, 7 { KEY_INPUT_J, 'j' }, { KEY_INPUT_K, 'k' }, { KEY_INPUT_L, 'l' }, 8 { KEY_INPUT_M, 'm' }, { KEY_INPUT_N, 'n' }, { KEY_INPUT_O, 'o' }, 9 { KEY_INPUT_P, 'p' }, { KEY_INPUT_Q, 'q' }, { KEY_INPUT_R, 'r' }, 10 { KEY_INPUT_S, 's' }, { KEY_INPUT_T, 't' }, { KEY_INPUT_U, 'u' }, 11 { KEY_INPUT_V, 'v' }, { KEY_INPUT_W, 'w' }, { KEY_INPUT_X, 'x' }, 12 { KEY_INPUT_Y, 'y' }, { KEY_INPUT_Z, 'z' }, { KEY_INPUT_0, '0' }, 13 { KEY_INPUT_1, '1' }, { KEY_INPUT_2, '2' }, { KEY_INPUT_3, '3' }, 14 { KEY_INPUT_4, '4' }, { KEY_INPUT_5, '5' }, { KEY_INPUT_6, '6' }, 15 { KEY_INPUT_7, '7' }, { KEY_INPUT_8, '8' }, { KEY_INPUT_9, '9' }, 16 { KEY_INPUT_SPACE, ' ' }, { KEY_INPUT_MINUS, '-' }, 17 { KEY_INPUT_YEN, '\' }, { KEY_INPUT_PREVTRACK, '^' }, 18 { KEY_INPUT_PERIOD, '.' }, { KEY_INPUT_SLASH, '/' }, 19 { KEY_INPUT_SEMICOLON, ';' }, { KEY_INPUT_COLON, ':' }, 20 { KEY_INPUT_LBRACKET, '[' }, { KEY_INPUT_RBRACKET, ']' }, 21 { KEY_INPUT_AT, '@' }, { KEY_INPUT_COMMA, ',' }, 22}; 23const int table_size = sizeof(table) / sizeof(*table); 24 25void gpUpdateKey(int Key[]) 26{ 27 char tmpKey[256]; 28 GetHitKeyStateAll(tmpKey); 29 for (int i = 0; i < 256; i++) 30 if (tmpKey[i] != 0) Key[i]++; 31 else Key[i] = 0; 32} 33 34int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 35{ 36 SetGraphMode(960, 720, 32); // ウィンドウの大きさを指定 37 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 38 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 39 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 40 41 unsigned int Cr = GetColor(255, 255, 255); // 白色の値を取得 42 char str[1024] = ""; 43 int len = 0; 44 int Key[256]; 45 46 while (ProcessMessage() == 0) { 47 gpUpdateKey(Key); 48 for (int i = 0; i < table_size; i++) 49 if (Key[table[i].key] == 1) str[len++] = table[i].val; 50 51 ClearDrawScreen(); 52 DrawString(250, 240 - 32, str, Cr); 53 ScreenFlip(); 54 } 55 DxLib_End(); 56 return 0; 57}

投稿2020/02/13 18:35

kazuma-s

総合スコア8224

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

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

R-ogiura

2020/02/14 02:15 編集

ありがとうございます。 あの本当に申し訳ないのですが、構造体の理解はまだわたしには難しいため、どうか配列で書いた場合のプログラムを書いていただけないでしょうか。 また、ローマ字で入力でohayouを「おはよう」にする方法は何かないでしょうか。
episteme

2020/02/14 03:32

「ただ教えて頂くのでは勉強にならないので」コードくれ? ナニソレ?
R-ogiura

2020/02/14 12:41 編集

頂いたコードを基に勉強していくという意味です。 最初から構造体は理解できないと伝えれば良かったです。 あの、出来れば私とkazuma-sさんの会話する場所なので割り込んでほしくありません。 会話の場所でないことは知っています。単純にepistemeが嫌いなので首を突っ込んでほしくないのです。 言いたいことがあれば自分の解答を編集して書いてください。
episteme

2020/02/14 08:49

コメント欄は「私とkazuma-sさんの会話する場所」ではありません。 マンツーマンがお望みならメンターを見つけましょう。
fana

2020/02/14 09:40

せっかくだから,この機会に構造体について勉強されてはどうでしょう. 今現在知らないからといって避けてしまうほどの難しい要素でもないと思いますし. (強引に「配列」だけでどうにかして書く方がかえって難易度高いコードになったりするかもですよ)
episteme

2020/02/14 10:46 編集

int keys[] = { ... }; char vals[] = { ... }; となるからそれだけで配列がひとつ増える。 # たったひとつと侮るなかれ、それが積み重なって # 百を超えるグローバル変数に。
episteme

2020/02/14 17:13

...何かあなたの気に障ること言いました?
R-ogiura

2020/02/14 17:39

はい、解答したりコメントしてくること自体が気に障ります。 ほっといてほしい。サムネの顔も見たくない。真面目に二度と解答してきてほしくない。
can110

2020/02/14 17:58

通報しました。
guest

0

DXライブラリ自体を使ったことも無いので,質問者の目的に合致する機能か否かわかりませんが,
GetKeyInputStringなる関数が存在するみたいですよ.

リファレンスページの
MakeKeyInputなる関数の箇所に何やら使い方の解説があります.

投稿2020/02/14 02:12

fana

総合スコア11996

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

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

R-ogiura

2020/02/14 02:15

どうもありがとうございます!
R-ogiura

2020/02/14 06:43

教えて頂いた関数GetKeyInputStringを使い文字列を習得できることはわかったのですが、 その習得した文字列がもともと保存されている文字列と一致した場合、言葉を返すようにしたいのです。 となるとGetKeyInputStringに入れた文字列を他の配列に入れて、if文で同じ文字列だった場合に言葉を返すようにすれば良いのでしょうか。
fana

2020/02/14 07:06

えっと,何を問われているのかがわかりません…. なぜならば, 【GetKeyInputString()によってキー入力された文字列が得られる→その文字列が「もともと保存されている文字列」と一致するのかどうかを判定する→一致するなら「言葉を返す」なる処理を行う】 という事柄があなたのコメント文章によって全て述べられています(問題点が見当たらない). そのことをまずは実際に実装してみれば良いと思いますし,そこで問題が実際に生じた際には別途質問するなりなされれば良いのではないでしょうか.
thkana

2020/02/14 23:58

新解きながら学ぶC言語、でしたっけ、それには文字列の比較についての例題はなかったのですか?
guest

0

if (Key[KEY_INPUT_XXX] == 1) で
押されたキーが XXXX であることがわかるんだから

C++

1struct key_table { 2 int key; 3 char val; 4}; 5 6key_table table[] = { 7 { KEY_INPUT_A, 'a' }, 8 { KEY_INPUT_B, 'b' }, 9... 10}; 11 12... 13for ( const auto& item : table ) { 14 if ( key[item.key] == 1 ) { 15 文字 item.val が押されたときの処理 (文字列の末尾に追加) 16 } 17}

こんなカンジでローマ字文字列が作れます。
※ 誤入力に対処するため back-space 対応が必要となるでしょう。

[追記]

C

1typedef struct { 2 int key; 3 char val; 4} key_table; 5 6key_table table[] = { 7 { KEY_INPUT_A, 'a' }, 8 { KEY_INPUT_B, 'b' }, 9 ... 10 { -1 , '\0' } 11}; 12 13... 14int i; 15for ( i = 0; table[i].key >= 0; ++i ) { 16 if ( key[table[i].key] == 1 ) { 17 文字 table[i].val が押されたときの処理 (文字列の末尾に追加) 18 } 19}

投稿2020/02/13 13:36

編集2020/02/13 18:05
episteme

総合スコア16612

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

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

R-ogiura

2020/02/13 14:08

すいません、C++とタグを書いていました。 どうかC言語で書く場合はどうしたらいいでしょうか。
episteme

2020/02/13 18:08

追記しました。 DXライブラリ使うならC++だけど...いいのかしら? [別件] > どうかC言語で書く場合はどうしたらいいでしょうか。 日本語おかしい。
R-ogiura

2020/02/14 01:57

C++しか使えないことを忘れていました。
episteme

2020/02/14 08:45

ローマ字→かな 変換はそこそこ面倒でしょう。ま、頑張って。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問