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

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

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

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

DXライブラリ

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

Q&A

解決済

2回答

285閲覧

入力するたびに下に返事の履歴が移動したいのですが、入力する言葉が切り替わるたびに履歴の文字も同じになってしまうので、履歴の意味をなさず困っています。**

KZK13

総合スコア43

C

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

DXライブラリ

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

0グッド

1クリップ

投稿2020/06/19 10:09

編集2020/06/19 10:37

入力するたびに下に返事の履歴が移動したいのですが、入力する言葉が切り替わるたびに履歴の文字も同じになってしまうので、履歴の意味をなさず困っています。
zの変数の値を継続しているとわかったのですが、そのzの値を継続しないようにしたいです。
出来れば、文字を入力する二度目からは文字が一文字ずつではなく、一気に描画されてしまうので
2回目の入力以降も文字が一文字ずつ描画されるようにしたいです。

#include "DxLib.h" #include <string> int konnnitiwasound = 0; int situreisimasitasound = 0; char String[256]; int InputHandle; int modoru = 0; std::string input; std::string message; int duration = 0; int konnnitiwa = 0; int sitaidou = 0; int sitaidouA = 0; int mozicount = 0; int mozicount2 = 0; int mozicount3 = 0; const char* str[2] = { "こんにちわ!","申し訳ございません! "};//ここで文字を直接書いてるので、この文字のバイト数が各posmozi[]に入るだけ int frame[2] = { 10,10};//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。 int posmozi[20];//文字のバイト数が入る箱を表している。 int countS[2];//次の文字が出るまでのカウントするためのもの int z;//関数drawString外でも使えるように外にも定義を書いた。zの数値は関係なく、文字列が入った数列がif文により同じ変数zの時にframe[z]と同じになるまで+1されていったり、+2バイトor+1バイトされていくため、 //文字が一文字ずつ入っていく、なんでzの変数に値を入れて動かす必要がないのだ。ちなみにfor (z = 0; z < 3; ++z)で書いてしまうとキーAを押した際のif文に関係なく関数drawStringの最初のzどこかに値が入っただけで繰り返しを開始してしまうため、今回のように同じ変数zの時にフレームを利用して描画するようにした。 char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。 void drawString(int z, int x, int y, int color) { c = str[z][posmozi[z]];//posmozi[z] if (countS[z] == 0 && c != '\0') posmozi[z] += IsDBCSLeadByte(c) ? 2 : 1; if (++countS[z] == frame[z]) countS[z] = 0; DrawFormatString(x, y, color, "%.*s", posmozi[z], str[z]); DrawFormatString(300, 300, (0,0,255), "countS[0]は%d", countS[0]); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SetGraphMode(1000, 780, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 // DXライブラリの初期化 if (DxLib_Init() == -1) return -1; SetFontSize(42); //サイズを42に変更 // 描画先を裏にする SetDrawScreen(DX_SCREEN_BACK); // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。 InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); // 作成したキー入力ハンドルをアクティブにする SetActiveKeyInput(InputHandle); // キー入力終了待ちループ // (ProcessMessageをループごとに行う) while (ProcessMessage() == 0) { // 画面の初期化 ClearDrawScreen(); //まずは描画する部分から作る。 // 入力モードを描画 DrawKeyInputModeString(640, 480); // 入力途中の文字列を描画 DrawKeyInputString(0, 0, InputHandle); //その後にif文での分岐を考える。 // 入力が終了している場合は終了 //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。 //エンターキーが押されていないとき?の部分。 if (CheckKeyInput(InputHandle) != 0) { // 入力された文字列を取得 // char buffer[256];// // 入力された文字列を取得 GetKeyInputString(String, InputHandle); // input = buffer; DrawString(0, 0, String, GetColor(255, 255, 255)); if (strcmp(String, "こんにちわ") == 0) { message = "こんにちわ!"; konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3"); PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK); ++konnnitiwa; ++mozicount; ++mozicount2; ++mozicount3; sitaidou = sitaidou + 50; z = 0; } else { message = "申し訳ございません!"; situreisimasitasound = LoadSoundMem("line-girl1-moushiwakegozamasen1.mp3"); PlaySoundMem(situreisimasitasound, DX_PLAYTYPE_BACK); ++mozicount; ++mozicount2; ++mozicount3; sitaidou = sitaidou + 50; z = 1; } //duration = 1; // 再度インプットハンドルをアクティブにする SetActiveKeyInput(InputHandle); // 入力文字列を初期化する SetKeyInputString("", InputHandle); } // DrawFormatString(100, 150, GetColor(255, 255, 0), "ProcessMessage()は%d,modoruは%d", ProcessMessage(), modoru); DrawFormatString(0, 150, GetColor(255, 255, 0), "zは%d,konnnitiwaは%d,sitaidouは%d,mozicountは%d",z, konnnitiwa, sitaidou, mozicount); DrawFormatString(0, 250, GetColor(255, 255, 0), "mozicount2は%d", mozicount2); if (mozicount > 0) { drawString(z, 10, 100 + (mozicount ), GetColor(5, 255, 255)); } if (mozicount2 > 1) { drawString(z, 10, 100 + (mozicount2*30), GetColor(5, 5, 255)); } if (mozicount3 > 2) { drawString(z, 10, 100 + (mozicount3*60), GetColor(5,100, 5)); } if (mozicount > 3) { mozicount = 1; konnnitiwa = 0; sitaidou = 0; mozicount2 = 0; mozicount3 = 0; } // 裏画面の内容を表画面に反映させる ScreenFlip(); } // 用済みのインプットハンドルを削除する DeleteKeyInput(InputHandle); // 画面の初期化 ClearDrawScreen(); // 裏画面の内容を表画面に反映させる ScreenFlip(); // キー入力待ち // WaitKey(); //ループないやループから出た後で何かしらの問題が発生したら終了する。 // DXライブラリの使用終了 DxLib_End(); // 終了 return 0; }

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

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

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

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

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

Penpen7

2020/06/19 10:22

脱字が多く読みにくいですし、日本語がおかしいです。 もう少し整理して書いていただけませんか?
KZK13

2020/06/19 10:37

書き直しました。
Penpen7

2020/06/19 11:35 編集

以下の点がよくわかりません。 1. このプログラムはどういう働きをするものなのですか? このプログラムは繰り返しユーザーからの入力を受け取り、 その後受け取った値と合わせて過去に入力された値もいくつか表示する。 という理解でよろしいですか? 2. ご質問は、過去に入力された値もいくつか表示するという仕様を踏まえソースコードを書いたものの、同じ値しか出てこないため、どのように修正すればいいかということでしょうか? 必要に応じて、スクリーンショットなどをあげていただくとありがたいです。
KZK13

2020/06/19 11:45

わかりにくくてすいません。 まず1について、例えばこんにちわと打つとこんにちわ!と返事がきます。その後に他のワード、例えば何も入力しないでエンターキーを押すと申し訳ございませんでした!とでます。できればこんにちわ!という返事が履歴が表示された状態で申し訳ございませんでした!と表示したいのです。過去の返事の履歴が残るようにしたいのですが、履歴がすべて上書きされてしまいます。 2に関して、そうです、なぜ思うように動かないかの原因はわかっています。しかし解決法がわかりません。
Penpen7

2020/06/19 12:51 編集

1に関してはなんとなくわかりましたが、現状どういう風に動いているかスクリーンショットを貼っていただけるでしょうか。 気づいた点としては、 int z; char c = str[z][posmozi[z]]; cの宣言時に初期化されていないzとposmoziがあります。 初期化せずに変数を使用すると、未定義動作のため予想しないバグが出る可能性があります。 ・使用しない変数(input, sitaidou, sitaidouA)があります。回答する際には変数の流れを追わなくてはならないため、使用していない変数などは消して、できる限りソースコードをミニマルにしていただけると助かります。 ・文字列の扱いもchar*とstringでややこしいです。特に理由がなければstringで統一したほうがいいと思います。
raccy

2020/06/19 14:19 編集

>Penpen7さん 全部グローバル変数なので、起動時に0(配列なら0埋め)で初期化されますので、未初期化による問題は無いはずです。必要でも無いのに全てグローバル変数にしてしまっているというコード上のつくりの問題はありますが。
episteme

2020/06/19 13:17

グローバル変数が必要になってしまっているというコード上の以下同文
guest

回答2

0

まずはデバッグできる環境を揃えましょう
Eclipseや、WindowsならVisualStudioなど。
コードの任意の行で実行を止め、変数の中身を参照できます。
また、そこから1行づつ実行させてコードの流れや変数の変化を見ることができます

そうすれば、アテずっぽでコードを書かなくて済むようになり、
なぜ動かないか他人に聞くようなこともしないで済むようになります

投稿2020/06/19 12:12

y_waiwai

総合スコア87774

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

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

0

ベストアンサー

こんなカンジ?

  • 一文字づつの描画はメンドクサイので割愛
  • Cで書くのもメンドクサイので勘弁

C++

1#include <DxLib.h> 2#include <string> 3#include <deque> 4 5int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { 6 7 std::deque<std::string> messages; 8 int InputHandle; 9 10 SetGraphMode(700, 780, 32); // ウィンドウの大きさを指定 11 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 12 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 13 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 14 SetFontSize(64); //サイズを64に変更 15 16 // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) 17 InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); 18 // 作成したキー入力ハンドルをアクティブにする 19 SetActiveKeyInput(InputHandle); 20 21 while (!ProcessMessage()) { 22 // 画面の初期化 23 ClearDrawScreen(); 24 25 // 入力が終了している場合 26 if (CheckKeyInput(InputHandle) != 0) { 27 char buffer[256]; 28 // 入力された文字列を取得 29 GetKeyInputString(buffer, InputHandle); 30 std::string input = buffer; 31 DrawString(0, 0, input.c_str(), GetColor(255, 255, 255)); 32 if (input == "こんにちわ") { 33 messages.push_back("こんにちわ!"); 34 } 35 else { 36 messages.push_back("申し訳ございません"); 37 } 38 while ( messages.size() > 3 ) { 39 messages.pop_front(); 40 } 41 // 再度インプットハンドルをアクティブにする 42 SetActiveKeyInput(InputHandle); 43 // 入力文字列を初期化する 44 SetKeyInputString("", InputHandle); 45 } 46 47 // 入力モードを描画 48 DrawKeyInputModeString(640, 480); 49 50 int height = 100; 51 for ( std::string message : messages ) { 52 DrawString(100, height, message.c_str(), GetColor(200, 200, 255)); 53 height += 60; 54 } 55 // 入力途中の文字列を描画 56 DrawKeyInputString(0, 0, InputHandle); 57 58 // 裏画面の内容を表画面に反映させる 59 ScreenFlip(); 60 } 61 62 63 // 用済みのインプットハンドルを削除する 64 DeleteKeyInput(InputHandle); 65 66 // DXライブラリの使用終了 67 DxLib_End(); 68 69 return 0; 70}

投稿2020/06/19 12:52

episteme

総合スコア16614

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

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

KZK13

2020/06/20 03:57

そうです!どんな感じのプログラムです。 C++はよくわからないので調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問