環境はvisual studio 2019,DXライブラリ
行いたいこと
- キー入力したものをローマ字で入力したい(例、a=あ、ohayou=おはよう)
- 入力した文字を配列に入れたい
- 配列に入れた文字を描画したい
これはキー入力のためにプログラムです。
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において、どう作ってよいかわかりません。どうか知恵を貸してください。
ですが、ただ教えて頂くのでは勉強にならないので、詳しい説明を付けて頂けるとありがたいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
+1
なぜ、ChangeWindowMode と DxLib_Init と SetDrawScreen を
2回ずつ呼び出しているのですか?
意味が分かってコードを書いていますか?
次のように書けば、文字列の入力はできますが、
大文字や ! " # $ などの記号を入力することができません。
Shiftキーの処理を追加しないといけないでしょう。
#include "DxLib.h"
struct key_table { int key; char val; } table[] = {
{ KEY_INPUT_A, 'a' }, { KEY_INPUT_B, 'b' }, { KEY_INPUT_C, 'c' },
{ KEY_INPUT_D, 'd' }, { KEY_INPUT_E, 'e' }, { KEY_INPUT_F, 'f' },
{ KEY_INPUT_G, 'g' }, { KEY_INPUT_H, 'h' }, { KEY_INPUT_I, 'i' },
{ KEY_INPUT_J, 'j' }, { KEY_INPUT_K, 'k' }, { KEY_INPUT_L, 'l' },
{ KEY_INPUT_M, 'm' }, { KEY_INPUT_N, 'n' }, { KEY_INPUT_O, 'o' },
{ KEY_INPUT_P, 'p' }, { KEY_INPUT_Q, 'q' }, { KEY_INPUT_R, 'r' },
{ KEY_INPUT_S, 's' }, { KEY_INPUT_T, 't' }, { KEY_INPUT_U, 'u' },
{ KEY_INPUT_V, 'v' }, { KEY_INPUT_W, 'w' }, { KEY_INPUT_X, 'x' },
{ KEY_INPUT_Y, 'y' }, { KEY_INPUT_Z, 'z' }, { KEY_INPUT_0, '0' },
{ KEY_INPUT_1, '1' }, { KEY_INPUT_2, '2' }, { KEY_INPUT_3, '3' },
{ KEY_INPUT_4, '4' }, { KEY_INPUT_5, '5' }, { KEY_INPUT_6, '6' },
{ KEY_INPUT_7, '7' }, { KEY_INPUT_8, '8' }, { KEY_INPUT_9, '9' },
{ KEY_INPUT_SPACE, ' ' }, { KEY_INPUT_MINUS, '-' },
{ KEY_INPUT_YEN, '\\' }, { KEY_INPUT_PREVTRACK, '^' },
{ KEY_INPUT_PERIOD, '.' }, { KEY_INPUT_SLASH, '/' },
{ KEY_INPUT_SEMICOLON, ';' }, { KEY_INPUT_COLON, ':' },
{ KEY_INPUT_LBRACKET, '[' }, { KEY_INPUT_RBRACKET, ']' },
{ KEY_INPUT_AT, '@' }, { KEY_INPUT_COMMA, ',' },
};
const int table_size = sizeof(table) / sizeof(*table);
void gpUpdateKey(int Key[])
{
char tmpKey[256];
GetHitKeyStateAll(tmpKey);
for (int i = 0; i < 256; i++)
if (tmpKey[i] != 0) Key[i]++;
else Key[i] = 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
SetGraphMode(960, 720, 32); // ウィンドウの大きさを指定
ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用
if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理
SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定
unsigned int Cr = GetColor(255, 255, 255); // 白色の値を取得
char str[1024] = "";
int len = 0;
int Key[256];
while (ProcessMessage() == 0) {
gpUpdateKey(Key);
for (int i = 0; i < table_size; i++)
if (Key[table[i].key] == 1) str[len++] = table[i].val;
ClearDrawScreen();
DrawString(250, 240 - 32, str, Cr);
ScreenFlip();
}
DxLib_End();
return 0;
}
投稿
score 982
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
DXライブラリ自体を使ったことも無いので,質問者の目的に合致する機能か否かわかりませんが,
GetKeyInputString
なる関数が存在するみたいですよ.
リファレンスページの
MakeKeyInput
なる関数の箇所に何やら使い方の解説があります.
投稿
score 2572
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
if (Key[KEY_INPUT_XXX] == 1) で
押されたキーが XXXX であることがわかるんだから
struct key_table {
int key;
char val;
};
key_table table[] = {
{ KEY_INPUT_A, 'a' },
{ KEY_INPUT_B, 'b' },
...
};
...
for ( const auto& item : table ) {
if ( key[item.key] == 1 ) {
文字 item.val が押されたときの処理 (文字列の末尾に追加)
}
}
こんなカンジでローマ字文字列が作れます。
※ 誤入力に対処するため back-space 対応が必要となるでしょう。
[追記]
typedef struct {
int key;
char val;
} key_table;
key_table table[] = {
{ KEY_INPUT_A, 'a' },
{ KEY_INPUT_B, 'b' },
...
{ -1 , '\0' }
};
...
int i;
for ( i = 0; table[i].key >= 0; ++i ) {
if ( key[table[i].key] == 1 ) {
文字 table[i].val が押されたときの処理 (文字列の末尾に追加)
}
}
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.65%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼