ページ 11

タイマーの作り方について・・・

Posted: 2011年5月09日(月) 23:55
by ノノノ
タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
どなたかわかる方がいらっしゃったら教えていただきたいのですが・・・
よろしくお願いします

Re: タイマーの作り方について・・・

Posted: 2011年5月10日(火) 00:13
by bitter_fox
ノノノ さんが書きました:タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
タイマーと言っても色々な種類があるのでどういったものかを明確にしていただかないと、答えようがないので、もう少々詳しく教えてくださいね。

Re: タイマーの作り方について・・・

Posted: 2011年5月10日(火) 00:14
by UN
まずゲームフレームでとるか、リアルな世界の経過時間でとりたいかで実装は違ってしまいます。
リアルな時間の場合には

コード:

 
struct TIMER
{
	void	Start()
	{
		::QueryPerformanceFrequency( &Freq );
		::QueryPerformanceCounter( &Begin );
	}
	void	End()
	{
		::QueryPerformanceCounter( &End );
	}
	
	// ミリ秒で取得
	float GetTimeMilliSeconds()
	{
		return static_cast< float>( End.QuadPart - Begin.QuadPart ) * 1000.0f / static_cast< float>( Freq.QuadPart );
	}

	LARGE_INTEGER		Begin;
	LARGE_INTEGER		End;
	LARGE_INTEGER		Freq;

};

TIMER Timer;

while( 1 )
{
	// timer start
	Timer.Start();
	
	/*
		計りたい処理
	*/
	Timer.End();
	
	printf( "%f\n", Timer.GetTimeMilliSeconds() );
}
ミリ秒でとりたいのか、単なる秒でとりたいのかなどはお好みで。
実際のフレーム換算であわせたい場合には、

コード:

 
int FrameCnt		= 0;
while( 1 )
{
	int WaitBeginTime 	= ::timeGetTime();
	
	if( FrameCnt == 60 )
	{
		printf( "60fpsにあわせているので、60フレに達したとき約一秒\n" );
		FrameCnt = 0;
	}
	else
	{
		FrameCnt += 1;
	}
		
	/*
		Wait、この場合は60fps
	*/
	int  DiffTime = ::timeGetTime() - WaitBeginTime;
	long WaitTime = ( 1000 / 60 ) - DiffTime;

	if( 0 < WaitTime )
	{
		::Sleep( WaitTime );
	}
}
こんなかんじでしょうか?
すいません、実際にコンパイル通したりデバッグしたわけではないので間違ってたらごめんなさい。

Re: タイマーの作り方について・・・

Posted: 2011年5月10日(火) 00:18
by softya(ソフト屋)
使う言語、開発環境、ライブラリなどを教えてください。それによって答えが全く違います。
あとゲームなのか、GUIアプリなのかとかでも違います。

Re: タイマーの作り方について・・・

Posted: 2011年5月11日(水) 00:42
by ノノノ
ノノノ さんが書きました:タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
どなたかわかる方がいらっしゃったら教えていただきたいのですが・・・
よろしくお願いします
前回具体的な質問をせずにいたので・・・
ひとまず使う言語はCで書きたいと思っています
使い道としては主にニコ動の生放送などで30分を測っておくのに使ったりしたいと思っています
感じとしてはまず時間を打ち込んで適当にキーを押したらスタートして1秒ごとに減っていって
残り1分になったら適当に呼び鈴(?)のようなものを鳴らして残り時間が0になったらアラーム音を鳴らす
というものです。市販のソフトだったりフリーでもあるのですがひとまず自分で作ってみようと思ったので
質問させていただきます。前回に引き続きわかる方がいらっしゃれば回答よろしくお願いします。

わざわざご指摘いただいてありがとうございます。

Re: タイマーの作り方について・・・

Posted: 2011年5月11日(水) 00:54
by softya(ソフト屋)
C言語を使うなら幾つか提案があります。
・コンソールアプリとして作る。beep音ぐらいしか使えない。
・Win32APIを使いGUIアプリとして作成する。かなり勉強が必要。
・DXライブラリを使いゲーム的な操作方法のタイマを作成する。Win32APIよりは楽。
・C言語をやめてjavascriptなどでブラウザで動くものを作る。 ← 比較的難度は低いです。
さて、どれにしましょう?

Re: タイマーの作り方について・・・

Posted: 2011年5月11日(水) 00:58
by ノノノ
softya(ソフト屋) さんが書きました:C言語を使うなら幾つか提案があります。
・コンソールアプリとして作る。beep音ぐらいしか使えない。
・Win32APIを使いGUIアプリとして作成する。かなり勉強が必要。
・DXライブラリを使いゲーム的な操作方法のタイマを作成する。Win32APIよりは楽。
・C言語をやめてjavascriptなどでブラウザで動くものを作る。 ← 比較的難度は低いです。
さて、どれにしましょう?
一応ゲーム作る過程で勉強したのでDXLibraryが一番身近です
なので出来ればDXLibraryで作れればなぁと思います。
よろしくお願いします。

Re: タイマーの作り方について・・・

Posted: 2011年5月11日(水) 01:22
by softya(ソフト屋)
ノノノ さんが書きました:一応ゲーム作る過程で勉強したのでDXLibraryが一番身近です
なので出来ればDXLibraryで作れればなぁと思います。
それであれば、
(1)KeyInputNumber()で数値→タイマー分数を得ます。
(2)開始時間をループ開始前にGetNowCount()で取得
(3)プログラムをゲームと同じwhileループで回します。
(4)経過時間を今のGetNowCount()と開始時間との差で計算(ミリ秒単位です)
(5)残り時間を秒単位or分単位にしてDrawFormatString()で表示。
で残り時間が1分を切ったときに呼び鈴(?)をサウンドで、0ならアラーム音を鳴らせば良いと思います。

なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。

Re: タイマーの作り方について・・・

Posted: 2011年5月11日(水) 22:22
by ノノノ
softya(ソフト屋) さんが書きました: なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
ウィンドウがフォーカスから外れるとはどういう意味ですか?
よろしくおねがいします。

Re: タイマーの作り方について・・・

Posted: 2011年5月11日(水) 22:32
by softya(ソフト屋)
ノノノ さんが書きました:
softya(ソフト屋) さんが書きました: なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
ウィンドウがフォーカスから外れるとはどういう意味ですか?
よろしくおねがいします。
DXライブラリのプログラムを動かしている最中に別のウィンドウを使いだす(例えばブラウザなど)とDXライブラリのプログラムは一時停止します。
このままだとタイマーとして使えないので、SetAlwaysRunFlag(TRUE);で常に動く状態に切り替える必要があります。
まず、違いをプログラムを書き換えて試してみてください。