プログラミング超初心者なのですが、いろいろなサイトを参考にしたのですが分からなかったので質問します。
簡単にいうと、質問に対して、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;
}
画像を一定時間表示するプログラムが作れません・・・
Re: 画像を一定時間表示するプログラムが作れません・・・
コードはcodeタグで囲んでいただき、かつきちんとインデントをしていただけると見やすくてありがたいです。
Sleep( 1000 );の直前にProcessMessage();を入れてみたらどうなりますか?
Sleep( 1000 );の直前にProcessMessage();を入れてみたらどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
手利益
Re: 画像を一定時間表示するプログラムが作れません・・・
>>みけ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;
}
Re: 画像を一定時間表示するプログラムが作れません・・・
このプログラムはコンパイルが通りません。
古いプログラムを実行していませんか?
古いプログラムを実行していませんか?
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で殴ればいい!(死亡フラグ)
Re: 画像を一定時間表示するプログラムが作れません・・・
申し訳ありません。
原因がわからなかったので、素直に実装することをおすすめします。
原因がわからなかったので、素直に実装することをおすすめします。
#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で殴ればいい!(死亡フラグ)