エンターを押すたびに次のメッセージを表示する処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 7年前

エンターを押すたびに次のメッセージを表示する処理

#1

投稿記事 by sadora3 » 5年前

エンターを押すたびに次のメッセージを表示する処理がどうしても出来ません。
最初は0が表示されていて、エンターが押されたら次はその下に1を表示したいです。
ですが、このソースコードでは0が消えて1が表示されてしまいます。
あと、
0
1
2
3
と表示された後に、エンターを押したら
1
2
3
4
という風に表示もさせたいです。以後エンターが押されたらカウントが増えていきます。
どうすればいいのでしょうか?

OS:Windows7
コンパイラ:Microsoft Visual Studio 2010
ライブラリ:DXライブラリ
言語:C

Cの知識はポインタ以外ならしっかり勉強してあります。

コード:

#include"DxLib.h"

int Cnt = 0;
int PutFlag = 1;

void F();

int ProcessLoop(){
	if(ProcessMessage() != 0){  return -1;  }
	if(ClearDrawScreen() != 0){ return -1;  }
	return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	SetGraphMode(640, 480, 32);
	if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){   return -1;  }
	while(ProcessLoop() == 0){
		F();
		ScreenFlip();
	}
	DxLib_End();
	return  0;
}

void F(){
	DrawBox(0, 400, 640, 480, GetColor(255,255,255), FALSE);
	if(CheckHitKey(KEY_INPUT_RETURN)){
		if(PutFlag == 0){
			Cnt++;
			PutFlag = 1;
		}
	}else{
		PutFlag = 0;
	}

	DrawFormatString(5, 400 + Cnt * 20, GetColor(255,255,255), "%d", Cnt);
}

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: エンターを押すたびに次のメッセージを表示する処理

#2

投稿記事 by Dixq (管理人) » 5年前

それは誰もが最初に疑問に思う壁ですよね。
うちのHPではそれに対する解決策として次のような方法を提案しています。
http://dixq.net/g/02_09.html
毎フレームキーの入力状態を監視し、キーに対応した配列要素をインクリメント。
キーの入力状態を知りたいときはKey配列を見ればよいという方法です。
そのKeyの配列要素が1のときのみ処理をするようにすれば1つずつ処理することができるでしょう。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: エンターを押すたびに次のメッセージを表示する処理

#3

投稿記事 by Tatu » 5年前

Cntが3未満の時とそうでない時で文字の描画処理を分けてはどうでしょうか。
Cntが3未満の時は0からCntまで描画。
そうでない時はCnt-3からCntまで描画。
というように。

sadora3
記事: 175
登録日時: 7年前

Re: エンターを押すたびに次のメッセージを表示する処理

#4

投稿記事 by sadora3 » 5年前

Tatuさんのヒントを頼りにCntの値が4以降の処理は出来ました!

コード:

#include"DxLib.h"

int Cnt = 0;
int PutFlag = 1;

void F();

int ProcessLoop(){
	if(ProcessMessage() != 0){  return -1;  }
	if(ClearDrawScreen() != 0){ return -1;  }
	return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	SetGraphMode(640, 480, 32);
	if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){   return -1;  }
	while(ProcessLoop() == 0){
		F();
		ScreenFlip();
	}
	DxLib_End();
	return  0;
}

void F(){
	DrawBox(0, 400, 640, 480, GetColor(255,255,255), FALSE);
	if(CheckHitKey(KEY_INPUT_RETURN)){
		if(PutFlag == 0){
			Cnt++;
			PutFlag = 1;
		}
	}else{
		PutFlag = 0;
	}

	if(Cnt < 4){
		DrawFormatString(5, 400 + Cnt * 20, GetColor(255,255,255), "%d", Cnt);
	}else{
		for(int y = 0, Num = -3; y < 61; y += 20, Num++){
			DrawFormatString(5, 400 + y, GetColor(255,255,255), "%d", Cnt + Num);
		}
	}
}
ですが、Cntの値が3以下の処理が思いつきません・・・。
助けて下さい・・・。

>Dixqさん
こんな便利なものがあるなんて知りませんでした!
ありがとうございます。
しかし、これは私の求めていた回答とは少し違いました(汗

>Tatuさん
おかげさまでCntの値が4以降の場合の処理は出来ました。
ありがとうございます。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: エンターを押すたびに次のメッセージを表示する処理

#5

投稿記事 by Dixq (管理人) » 5年前

え、そうですか?
やりたいのはこういうことではないのですか?

コード:

#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;
}

char* txt[]= {
	"テスト1です",
	"テスト2です",
	"テスト3です",
	"テスト4です",
	"テスト5です",
	"テスト6です",
	"テスト7です",
	"テスト8です",
	"テスト9です",
	"これ以上押さないでください"
};

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	int cnt=0;

	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

		DrawFormatString( 0, 0, GetColor(255,255,255), txt[cnt] ); // 描画

		if( Key[KEY_INPUT_RETURN] == 1 ){ // エンタキーが押された瞬間なら
			cnt++;                 // 加算
		}

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
} 
実行結果
[youtube][/youtube]

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: エンターを押すたびに次のメッセージを表示する処理

#6

投稿記事 by tk-xleader » 5年前

 たぶん、sadora3さんの作りたいプログラムは、こういうイメージのコードになるのかなと思います。

コード:

int start = Cnt - 3;
if(start < 0) start = 0;
for(int i = start; i <= Cnt; i++){
	iの描画コード;
}
 要するに、スタートを先に決めてしまい、スタートの値が0よりも小さければ強制的に0にしてしまうわけです。そうすれば、たぶんイメージどおりのコードが書けるのではないかと…

sadora3
記事: 175
登録日時: 7年前

Re: エンターを押すたびに次のメッセージを表示する処理

#7

投稿記事 by sadora3 » 5年前

コード:

#include"DxLib.h"
 
int Cnt = 0;
int PutFlag = 1;
 
void F();
 
int ProcessLoop(){
    if(ProcessMessage() != 0){  return -1;  }
    if(ClearDrawScreen() != 0){ return -1;  }
    return 0;
}
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
    ChangeWindowMode(TRUE);
    SetGraphMode(640, 480, 32);
    if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){   return -1;  }
    while(ProcessLoop() == 0){
        F();
        ScreenFlip();
    }
    DxLib_End();
    return  0;
}
 
void F(){
    DrawBox(0, 400, 640, 480, GetColor(255,255,255), FALSE);
    if(CheckHitKey(KEY_INPUT_RETURN)){
        if(PutFlag == 0){
            Cnt++;
            PutFlag = 1;
        }
    }else{
        PutFlag = 0;
    }

    if(Cnt < 4){
		for(int i = 0; i <= Cnt; i++){
			DrawFormatString(5, 400 + i * 20, GetColor(255,255,255), "%d", i);
		}
    }else{
        for(int y = 0, Num = -3; y < 61; y += 20, Num++){
            DrawFormatString(5, 400 + y, GetColor(255,255,255), "%d", Cnt + Num);
        }
    }
}
出来ました!私がやりたかったのはこういう処理でした!

>Dixqさん
紛らわしい書き方してすみませんでした。
やりたかったのは表示方法についてで、キーの入力についてではありませんでした(笑

>tk-xleaderさん
ヒントありがとうございました。
ですが、他に変数を使わずに自分のしたいことは出来ちゃいました。

回答してくださった皆さん本当にありがとうございました!
また何かあればよろしくお願いしますです。

[追記]
見返したらこれ、Cntの値が3以下の処理もTatuさんのヒント通りにやれば何も問題ありませんでした・・・。
よく読んでいませんでした。失礼しました(_ _)

閉鎖

“C言語何でも質問掲示板” へ戻る