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

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

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

#1

投稿記事 by ノノノ » 14年前

タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
どなたかわかる方がいらっしゃったら教えていただきたいのですが・・・
よろしくお願いします

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

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

#2

投稿記事 by bitter_fox » 14年前

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

UN
記事: 18
登録日時: 14年前
住所: 神奈川県

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

#3

投稿記事 by UN » 14年前

まずゲームフレームでとるか、リアルな世界の経過時間でとりたいかで実装は違ってしまいます。
リアルな時間の場合には

コード:

 
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 );
	}
}
こんなかんじでしょうか?
すいません、実際にコンパイル通したりデバッグしたわけではないので間違ってたらごめんなさい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 14年前

使う言語、開発環境、ライブラリなどを教えてください。それによって答えが全く違います。
あとゲームなのか、GUIアプリなのかとかでも違います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ノノノ

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

#5

投稿記事 by ノノノ » 14年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 14年前

C言語を使うなら幾つか提案があります。
・コンソールアプリとして作る。beep音ぐらいしか使えない。
・Win32APIを使いGUIアプリとして作成する。かなり勉強が必要。
・DXライブラリを使いゲーム的な操作方法のタイマを作成する。Win32APIよりは楽。
・C言語をやめてjavascriptなどでブラウザで動くものを作る。 ← 比較的難度は低いです。
さて、どれにしましょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ノノノ

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

#7

投稿記事 by ノノノ » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 14年前

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

なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ノノノ

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

#9

投稿記事 by ノノノ » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#10

投稿記事 by softya(ソフト屋) » 14年前

ノノノ さんが書きました:
softya(ソフト屋) さんが書きました: なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
ウィンドウがフォーカスから外れるとはどういう意味ですか?
よろしくおねがいします。
DXライブラリのプログラムを動かしている最中に別のウィンドウを使いだす(例えばブラウザなど)とDXライブラリのプログラムは一時停止します。
このままだとタイマーとして使えないので、SetAlwaysRunFlag(TRUE);で常に動く状態に切り替える必要があります。
まず、違いをプログラムを書き換えて試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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