トップページ > 過去ログ > 記事閲覧
タイマー作成
名前:にこ 日時: 2008/07/20 20:01

DXライブリを用いてタイマーをつくろうとしている初心者ですが。。。helpやC言語のページを必死に見てプログラムをくんだのですが、問題が発生しまして;;

#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE hInstance, 
     HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{ 
     if(DxLib_Init()==-1)return -1;
      
     int g0,g1,g2,g3,g4,g5,g6,g7,g8,g9,i,g[10];
     
     	
        g0 = LoadGraph( "0.png" ) ;
        g1 = LoadGraph( "1.png" ) ;    
	g2 = LoadGraph( "2.png" ) ;
	g3 = LoadGraph( "3.png" ) ;
	g4 = LoadGraph( "4.png" ) ;
        g5 = LoadGraph( "5.png" ) ;
	g6 = LoadGraph( "6.png" ) ;
	g7 = LoadGraph( "7.png" ) ;
	g8 = LoadGraph( "8.png" ) ;
	g9 = LoadGraph( "9.png" ) ;
	
	g[0]=g0;
     	g[1]=g1;
     	g[2]=g2;
     	g[3]=g3;
     	g[4]=g4;
     	g[5]=g5;
     	g[6]=g6;
     	g[7]=g7;
     	g[8]=g8;
     	g[9]=g9;
     
	
        DrawGraph( 0 , 0 , g0 , TRUE ) ;
	DrawGraph( 130 , 0 , g0 , TRUE ) ;
	LoadGraphScreen( 260 , 0 , "ten.png" , TRUE ) ;
	DrawGraph( 310 , 0 , g0 , TRUE ) ;
	DrawGraph( 440 , 0 , g0 , TRUE ) ;
	

	for(i=0;i<=8;i++){
	WaitTimer( 1000 ) ;
	DrawGraph( 440 , 0 , g[i+1] , FALSE ) ;
	WaitKey() ;
        break;
	}
	
  	DxLib_End() ;		// DXライブラリ使用の終了処理
	return 0 ;		// ソフトの終了
}
    
↑のがプログラムになります。初期の画像は
00:00
とペイントの画像を表示しています。そこに1秒たつごとに配列に入れた0〜9を表示させていくという簡単なものです。このプログラムはまだ作成途中で0〜から9までしかカウントできません。
このプログラムを実行するとなぜかカウントが1で止まってしまうのですが。。どうしたらいいでしょうか?またタイマーをつくるにあたってほかにいい方法があれば教えていただけるとうれしいです。


長文失礼しました。

Page: 1 |

Re: タイマー作成 ( No.1 )
名前:おとうさん 日時:2008/07/20 21:52

にこさん、はじめまして

WaitKey(); と break; がいらないんじゃないですか?

この2行をはずせば、にこさんの思惑通りに表示されるんじゃないかと思いますが、いかがでしょう?

ところで、WaitKey(); は、forループの外側(DxLib_End(); の前)につけるといいかもしれませんね。
Re: タイマー作成 ( No.2 )
名前:にこ 日時:2008/07/21 11:43

返信ありがとうございます。
アドバイスどうりやることでうまくいきました。
これはキーの入力をずっと待ってるからループしなかったんですかね?

4重のfor文を用いることで99分タイマーにできました。

また質問なんですがこのプログラムではfor文を抜けまではタイマーをとめることが出来ないのですがキーなど何かの入力でタイマーを適当な時間でストップさせたいときはどうすればよいのでしょうか?
WaitKey(); をfor文の中に入れるとできなくなってしまうので;;
度々申し訳ないのですがアドバイスお願いします。
Re: タイマー作成 ( No.3 )
名前:ライブラリ使用者 日時:2008/07/21 19:59

一番楽かなと思う方法なら、ProcessMessage()をループ中に挟んではいかがでしょう。
で、この時にエラーが戻ったらループを抜ける処理を加える。
※この方法だと、アプリを×にて終了した場合にしか使えないですが。。

別の方法では、スレッドを使う方法でしょうかね。
ただタイマーとして機能させたいのであれば上記で十分な気もするので、説明は省きます。
(興味持ったのなら調べてみるといいかもしれません
Re: タイマー作成 ( No.4 )
名前:おとうさん 日時:2008/07/21 21:37

にこさん、こんばんは

CheckHitKey()を使ってみてはどうですか?

for(i=0;i<=8;i++){
  if(CheckHitKey(KEY_INPUT_E)!=0)	break; // Eキーを押すとforループを抜ける

  WaitTimer( 1000 ) ;
  DrawGraph( 440 , 0 , g[i+1] , FALSE ) ;
}

このようにするとEキーを押すとループから抜けられます。ただし、WaitTimerがかかっていることもあって、
少し押しつづけないと反応しませんが……
Re: タイマー作成(改良版) ( No.5 )
名前:おとうさん 日時:2008/07/21 23:26

関数リファレンスページのサンプルプログラムを参考にして、少し改良しました。

i=0;    // iを初期化
while( CheckHitKey( KEY_INPUT_E ) == 0 && i <= 8 ){
    // メッセージ処理
    if( ProcessMessage() == -1 ){
        break ;	// エラーが発生したらループを抜ける
    }

    WaitTimer( 1000 ) ;
    DrawGraph( 440 , 0 , g[i+1] , FALSE ) ;
    i++;
}

こちらのほうがいいと思います。

追伸: すみません。iの設定が間違っていたので、訂正しました。(前のでは、g[i+1]がg[10]になってしまいますね)

Page: 1 |