画像を一定時間表示するプログラムが作れません・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
手利益

画像を一定時間表示するプログラムが作れません・・・

#1

投稿記事 by 手利益 » 12年前

プログラミング超初心者なのですが、いろいろなサイトを参考にしたのですが分からなかったので質問します。
簡単にいうと、質問に対して、Zを押したらAの画像を1秒表示、Xを押したらBの画像を1秒表示するというプログラムを作成したいのです。
しかし、以下のようなプログラムを実行すると、

Zを押す→一秒待つ→Aの画像→次の質問

というようになってしまいます。
これを

Zを押す→Aの画像→一秒待つ→次の質問

というように動かすためにはどうすればよいのでしょうか?
何分初めて本格的なプログラムを組んでいるので、見づらいところもあるかもしれません。申し訳ありません。



#include "DxLib.h"


//プロトタイプ宣言
int sitsumon(int);
int hentou(int,int);



//キー入力に関する処理
int Key[256];

//キーの入力状態を更新する
int gpUpdateKey() {

char tmpKey[256]; //現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); //全てのキーの入力状態を得る

for( int i=0 ; i<256 ; i++ ){

if( tmpKey != 0 ){ //i番のキーコードに対応するキーが押されたら
Key++; //加算
} else { //押されていなければ
Key = 0; //0にする
}

}

return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
DxLib_Init();

//宣言
int i;
int seigo;


//画像処理
int Handle[5];
Handle[0] = LoadGraph( "Z.png" );
Handle[1] = LoadGraph( "X.png" );
Handle[2] = LoadGraph( "A.png" );
Handle[3] = LoadGraph( "B.png" );

DrawGraph ( 0, 380, Handle[0], TRUE );
DrawGraph ( 540, 380, Handle[1], TRUE );


//質問についての処理
for ( i=1 ; i<=2 ; i++ ){

sitsumon(i);

//入力処理
int A;

while( gpUpdateKey()==0 )
{

if( Key[ KEY_INPUT_Z ]==1 ){
A = 1;
break;
}
if( Key[ KEY_INPUT_X ]==1 ){
A = 2;
break;
}

//windoes依存のメッセージ処理を行う
if ( ProcessMessage() == -1 ) break;
}


//回答を判断
hentou = hentou(i,A);


if ( hentou == 1 ){
DrawGraph( 0, 0, Handle[2], FALSE );
} else {
DrawGraph( 0, 0, Handle[3], FALSE );
}

Sleep( 1000 );

}



//Escキーが入力されたら終了
while( 1 ){
ProcessMessage();
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ){
break;
}
}

DxLib_End(); //DXライブラリ終了処理
return 0;
}



//質問の表示
int sitsumon(int i)
{
//画像格納
int Gazou[2];
Gazou[ 1] = LoadGraph( "sitsumon01.png" );
Gazou[ 2] = LoadGraph( "sitsumon02.png" );

//画像描画
DrawGraph ( 192, 50, Gazou, TRUE );
return 0;
}



//入力された答えを判断
int hentou(int i, int A)
{
int kotae=0;

//質問1
if ( i==1 ){
if ( A == 1 ){
kotae = 1;
}
}

//質問2
if ( i==2 ){
if ( A == 2 ){
kotae = 1;
}
}

return kotae;

}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 画像を一定時間表示するプログラムが作れません・・・

#2

投稿記事 by みけCAT » 12年前

コードはcodeタグで囲んでいただき、かつきちんとインデントをしていただけると見やすくてありがたいです。

Sleep( 1000 );の直前にProcessMessage();を入れてみたらどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

手利益

Re: 画像を一定時間表示するプログラムが作れません・・・

#3

投稿記事 by 手利益 » 12年前

>>みけCAT様
お早い返信ありがとうございます。
すいません、初めての投稿だったので・・・

ご指摘いただいた通りやってみたのですが、やはり変化がありません・・・

コード:

#include "DxLib.h"


//プロトタイプ宣言
int sitsumon(int);
int hentou(int,int);



//キー入力に関する処理
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 )
{
	ChangeWindowMode( TRUE );	
	DxLib_Init();	

	//宣言
	int i;
	int seigo;


	//画像処理
	int Handle[5];
	Handle[0] = LoadGraph( "Z.png" );
	Handle[1] = LoadGraph( "X.png" );
	Handle[2] = LoadGraph( "A.png" );
	Handle[3] = LoadGraph( "B.png" );

	DrawGraph ( 0, 380, Handle[0], TRUE );
	DrawGraph ( 540, 380, Handle[1], TRUE );


	//質問についての処理
	for ( i=1 ; i<=2 ; i++ ){

		sitsumon(i);

		//入力処理
		int A;

		while( gpUpdateKey()==0 )
		{

			if( Key[ KEY_INPUT_Z ]==1 ){
			A = 1;
			break;
			}
			if( Key[ KEY_INPUT_X ]==1 ){
			A = 2;
			break;
			}

			//windoes依存のメッセージ処理を行う
			( ProcessMessage() == -1 ) break;
		}


		//回答を判断
		hentou = hentou(i,A);


		if ( hentou == 1 ){
			DrawGraph( 0, 0, Handle[2], FALSE );
		} else {
			DrawGraph( 0, 0, Handle[3], FALSE );
		}

		ProcessMessage();
		Sleep( 1000 );

	}



	//Escキーが入力されたら終了
	while( 1 ){
		ProcessMessage();
		if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ){
			break;
		}
	}

	DxLib_End();	//DXライブラリ終了処理
	return 0;
}



//質問の表示
int sitsumon(int i)
{
	//画像格納
	int Gazou[2];
	Gazou[ 1] = LoadGraph( "sitsumon01.png" );
	Gazou[ 2] = LoadGraph( "sitsumon02.png" );

	//画像描画
	DrawGraph ( 192, 50, Gazou[i], TRUE );
	return 0;
}



//入力された答えを判断
int hentou(int i, int A)
{
	int kotae=0;

	//質問1
	if ( i==1 ){
		if ( A == 1 ){
			kotae = 1;
		}
	}

	//質問2
	if ( i==2 ){
		if ( A == 2 ){
			kotae = 1;
		}
	}

	return kotae;

}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 画像を一定時間表示するプログラムが作れません・・・

#4

投稿記事 by みけCAT » 12年前

このプログラムはコンパイルが通りません。
古いプログラムを実行していませんか?

コード:

main.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
main.cpp:75:40: error: expected ';' before 'break'
main.cpp:80:28: error: assignment of function 'int hentou(int, int)'
main.cpp:80:28: error: cannot convert 'int' to 'int(int, int)' in assignment
main.cpp:83:24: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 画像を一定時間表示するプログラムが作れません・・・

#5

投稿記事 by みけCAT » 12年前

申し訳ありません。
原因がわからなかったので、素直に実装することをおすすめします。

コード:

#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 sitsumonGazou[2];

//質問の表示
int sitsumon(int i) {
	//画像描画
	DrawGraph(192,50,sitsumonGazou[i-1],TRUE);
	return 0;
}

//入力された答えを判断
int hentou(int i, int A) {
	int kotae=0;

	//質問1
	if(i==1) {
		if(A==1) {
			kotae=1;
		}
	}

	//質問2
	if(i==2){
		if(A==2) {
			kotae=1;
		}
	}

	return kotae;
 
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
	ChangeWindowMode( TRUE );
	DxLib_Init();
	SetDrawScreen( DX_SCREEN_BACK );

	sitsumonGazou[0]=LoadGraph("sitsumon01.png");
	sitsumonGazou[1]=LoadGraph("sitsumon02.png");

	int graphicHandle[4];
	graphicHandle[0]=LoadGraph("Z.png");
	graphicHandle[1]=LoadGraph("X.png");
	graphicHandle[2]=LoadGraph("A.png");
	graphicHandle[3]=LoadGraph("B.png");

	int nowQuery=1;
	int seigo=0;
	int startWaitingTime=0;
	bool endFlag=false;
	bool isQuestioning=true;

	while(!endFlag && !ProcessMessage() && !ClearDrawScreen() && !gpUpdateKey()) {
		int A=0;
		DrawGraph(0,380,graphicHandle[0],TRUE);
		DrawGraph(540,380,graphicHandle[1],TRUE);
		sitsumon(nowQuery);
		if(isQuestioning) {
			if(Key[KEY_INPUT_Z]==1) {
				A=1;
			}
			if(Key[KEY_INPUT_X]==1) {
				A=2;
			}
			if(A!=0) {
				seigo=hentou(nowQuery,A);
				startWaitingTime=GetNowCount();
				isQuestioning=false;
			}
		} else {
			if (seigo==1){
				DrawGraph(0,0,graphicHandle[2],FALSE);
			} else {
				DrawGraph(0,0,graphicHandle[3],FALSE);
			}
			if(GetNowCount()-startWaitingTime>=1000) {
				if(nowQuery<2) {
					nowQuery++;
					isQuestioning=true;
				} else {
					if(Key[KEY_INPUT_ESCAPE]==1) {
						endFlag=true;
					}
				}
			}
		}
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

手利益

Re: 画像を一定時間表示するプログラムが作れません・・・

#6

投稿記事 by 手利益 » 12年前

>>みけCAT様

おかげさまでうまくいきました!ありがとうございます。

確かにどこかで変な書き方をしていました。

閉鎖

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