タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
どなたかわかる方がいらっしゃったら教えていただきたいのですが・・・
よろしくお願いします
タイマーの作り方について・・・
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: タイマーの作り方について・・・
タイマーと言っても色々な種類があるのでどういったものかを明確にしていただかないと、答えようがないので、もう少々詳しく教えてくださいね。ノノノ さんが書きました:タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
Re: タイマーの作り方について・・・
まずゲームフレームでとるか、リアルな世界の経過時間でとりたいかで実装は違ってしまいます。
リアルな時間の場合には
ミリ秒でとりたいのか、単なる秒でとりたいのかなどはお好みで。
実際のフレーム換算であわせたい場合には、
こんなかんじでしょうか?
すいません、実際にコンパイル通したりデバッグしたわけではないので間違ってたらごめんなさい。
リアルな時間の場合には
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: タイマーの作り方について・・・
使う言語、開発環境、ライブラリなどを教えてください。それによって答えが全く違います。
あとゲームなのか、GUIアプリなのかとかでも違います。
あとゲームなのか、GUIアプリなのかとかでも違います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タイマーの作り方について・・・
前回具体的な質問をせずにいたので・・・ノノノ さんが書きました:タイマーをつくろうと思うのですがどのように作れば良いのかわからず困っております・・・
どなたかわかる方がいらっしゃったら教えていただきたいのですが・・・
よろしくお願いします
ひとまず使う言語はCで書きたいと思っています
使い道としては主にニコ動の生放送などで30分を測っておくのに使ったりしたいと思っています
感じとしてはまず時間を打ち込んで適当にキーを押したらスタートして1秒ごとに減っていって
残り1分になったら適当に呼び鈴(?)のようなものを鳴らして残り時間が0になったらアラーム音を鳴らす
というものです。市販のソフトだったりフリーでもあるのですがひとまず自分で作ってみようと思ったので
質問させていただきます。前回に引き続きわかる方がいらっしゃれば回答よろしくお願いします。
わざわざご指摘いただいてありがとうございます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: タイマーの作り方について・・・
C言語を使うなら幾つか提案があります。
・コンソールアプリとして作る。beep音ぐらいしか使えない。
・Win32APIを使いGUIアプリとして作成する。かなり勉強が必要。
・DXライブラリを使いゲーム的な操作方法のタイマを作成する。Win32APIよりは楽。
・C言語をやめてjavascriptなどでブラウザで動くものを作る。 ← 比較的難度は低いです。
さて、どれにしましょう?
・コンソールアプリとして作る。beep音ぐらいしか使えない。
・Win32APIを使いGUIアプリとして作成する。かなり勉強が必要。
・DXライブラリを使いゲーム的な操作方法のタイマを作成する。Win32APIよりは楽。
・C言語をやめてjavascriptなどでブラウザで動くものを作る。 ← 比較的難度は低いです。
さて、どれにしましょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タイマーの作り方について・・・
一応ゲーム作る過程で勉強したのでDXLibraryが一番身近ですsoftya(ソフト屋) さんが書きました:C言語を使うなら幾つか提案があります。
・コンソールアプリとして作る。beep音ぐらいしか使えない。
・Win32APIを使いGUIアプリとして作成する。かなり勉強が必要。
・DXライブラリを使いゲーム的な操作方法のタイマを作成する。Win32APIよりは楽。
・C言語をやめてjavascriptなどでブラウザで動くものを作る。 ← 比較的難度は低いです。
さて、どれにしましょう?
なので出来ればDXLibraryで作れればなぁと思います。
よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: タイマーの作り方について・・・
それであれば、ノノノ さんが書きました:一応ゲーム作る過程で勉強したのでDXLibraryが一番身近です
なので出来ればDXLibraryで作れればなぁと思います。
(1)KeyInputNumber()で数値→タイマー分数を得ます。
(2)開始時間をループ開始前にGetNowCount()で取得
(3)プログラムをゲームと同じwhileループで回します。
(4)経過時間を今のGetNowCount()と開始時間との差で計算(ミリ秒単位です)
(5)残り時間を秒単位or分単位にしてDrawFormatString()で表示。
で残り時間が1分を切ったときに呼び鈴(?)をサウンドで、0ならアラーム音を鳴らせば良いと思います。
なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タイマーの作り方について・・・
ウィンドウがフォーカスから外れるとはどういう意味ですか?softya(ソフト屋) さんが書きました: なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
よろしくおねがいします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: タイマーの作り方について・・・
DXライブラリのプログラムを動かしている最中に別のウィンドウを使いだす(例えばブラウザなど)とDXライブラリのプログラムは一時停止します。ノノノ さんが書きました:ウィンドウがフォーカスから外れるとはどういう意味ですか?softya(ソフト屋) さんが書きました: なお、ウィンドウがフォーカスから外れるとタイマーが停止するのでSetAlwaysRunFlag(TRUE);で動き続けるよう初期化してください。
よろしくおねがいします。
このままだとタイマーとして使えないので、SetAlwaysRunFlag(TRUE);で常に動く状態に切り替える必要があります。
まず、違いをプログラムを書き換えて試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。