http://dixq.net/forum/viewtopic.php?f=3&t=16845
質問者が投稿したコードを見て書き直してみました。
しかし、優れた見本を写すのが一番良いと思うので
私が書いたコードはトピックではなく、ここに置いておきます。
► スポイラーを表示
#include "DxLib.h"
//KeyおよびgpUpdateKey()については新ゲームプログラミングの館2.9を見てください
//このようにすることでAキーを押しっぱなしにしていても勝手に進みません。
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;
}
//会話制御(描画は分けたほうがいいと思う)
void conversation_control(){
//controlとaの意味が分からないのでstate(状態)としました。
//0:会話なし 1:会話1 2:会話2(選択肢付) 3:会話3(はい選択時) 4:会話4(いいえ選択時)
static int state=0;
//bはおそらく選択肢の事だと思われるのでselectに置き換えた
static int select=0;
//色はint型の変数に格納する
//この関数の中ならどこでも使えるようにここに書いた
//黒はbrackではなく、black
int black = GetColor(0, 0, 0);//黒色
//コメントが赤ではなく黒になっていました
int red = GetColor(255, 0, 0);//赤色
int white = GetColor(255, 255, 255);//白色
//状態によって制御を変える
//ScreenFlipはメインループの1回の繰り返しで1回だけ使うようにしましょう
//WaitTimer,WaitKeyで無理やり止めるのは避けたほうがよいと思います。
//選択肢のついたウィンドウは別の場所に描画するようにしました(同じ場所の方が良ければstateを分ければいいと思います)
switch(state){
//Aキーを押したら会話開始。
case 0:
if(Key[KEY_INPUT_A] == 1){
state=1;
select=0;
}
DrawFormatString(62, 350, white, "Aキーで会話が始まります");
break;
//会話1
case 1:
DrawBox(50, 330, 320, 444, white, TRUE);
DrawFormatString(62, 350, black, "今あなたは元気ですか?");
//選択肢
DrawBox(250,186,320,300,white,TRUE);
//DrawBox(50, 330, 320, 444, white, TRUE);
//上下キーで選択
if (CheckHitKey(KEY_INPUT_UP) == 1)
select = 0;
if (CheckHitKey(KEY_INPUT_DOWN) == 1)
select = 1;
//選択肢の文字描画
if (select == 0){
DrawFormatString(262, 216, red, "はい");
DrawFormatString(262, 248, black, "いいえ");
//DrawFormatString(62, 350, red, "はい");
//DrawFormatString(62, 382, black, "いいえ");
}
if (select == 1){
DrawFormatString(262, 216, black, "はい");
DrawFormatString(262, 248, red, "いいえ");
//DrawFormatString(62, 350, black, "はい");
//DrawFormatString(62, 382, red, "いいえ");
}
//決定
if(Key[KEY_INPUT_A] == 1){
if(select==0) state=2;
if(select==1) state=3;
}
break;
case 2:
DrawBox(50, 330, 320, 444, white, TRUE);
DrawFormatString(62, 350, black, "そうですか!");
DrawFormatString(62, 370, black, "それはよかったです!");
if(Key[KEY_INPUT_A] == 1){
state=0;
}
break;
case 3:
DrawBox(50, 330, 320, 444, white, TRUE);
DrawFormatString(62, 350, black, "元気ないのですか・・・。");
DrawFormatString(62, 370, black, "体調には気を付けてくださいね。");
if(Key[KEY_INPUT_A] == 1){
state=0;
}
break;
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey()==0){
conversation_control();
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}