入力するたびに下に返事の履歴が移動したいのですが、入力する言葉が切り替わるたびに履歴の文字も同じになってしまうので、履歴の意味をなさず困っています。
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; }
回答2件
あなたの回答
tips
プレビュー