トップページ > 過去ログ > 記事閲覧
タイマーによる画面切り替え
名前:Nix 日時: 2009/05/05 04:19

第4章p.145のGetNowCount関数とグローバル関数strattimeを使い画面が表示された時間を使う所で分からない点がありまして、質問させてもらいます。 int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){ ………………………………… switch(gstate){ case GAME_TITLE: DrawGameTitle(); break; case GAME_MAIN: DrawGameMain(); break; case GAME_OVER: DrawGameOver(); break; case GAME_CLEAR: DrawGameClear(); break; ………………………………… } /●ゲームタイトル画面の表示 void DrawGameTitle(){ ………………………………… gstate = GAME_MAIN ………………………………… } //●ゲーム本体の実行 void DrawGameMain(){ ………………………………… if(AtariHantei() == 1){ gstate = GAME_OVER; starttime = GetNowCount(); } ………………………………… } //●ゲームオーバー画面の表示 void DrawGameOver(){ ………………………………… if(GetNowCount() - starttime > 5000){ int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if(key & PAD_INPUT_A){ gstate = GAME_TITLE; } } } 流れとしては… 1:WinMain 2:case GAME_TITLE:→DrawGameTitle 3:gstate = GAME_MAIN 4:case GAME_MAIN:→DrawGameMain(); 5:void DrawGameMain(){ ………………………………… if(AtariHantei() == 1){ gstate = GAME_OVER; 「starttime = GetNowCount();」←??? } 6:case GAME_OVER:→DrawGameOver(); 7:void DrawGameOver(){ ………………………………… if(GetNowCount() - starttime > 5000){ int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if(key & PAD_INPUT_A){ gstate = GAME_TITLE; } } } だと思うのですが「5〜7」の間の処理の順番が今一分からないのです。 特に5の gstate = GAME_OVER;の後に書かれているstarttime = GetNowCount();はいつ値が入るのでしょうか? また、GetNowCount関数に入る値はいつ頃から入るのでしょうか?ウィンドウが起動してから?それともゲームオーバー処理に移ってからカウントが始まるのでしょうか? 見難くてスイマセン。質問を書くのですらどう書いて良いか分からなくなりました(汗) まだ未熟な若輩者(プログラミング)ですがご教授宜しくお願いします。

Page: 1 |

Re: タイマーによる画面切り替え ( No.1 )
名前:TK 日時:2009/05/05 23:32

リファレンスより引用-------------------------- 宣言 int GetNowCount( void ) ; 概略 ミリ秒単位の精度を持つカウンタの現在値を得る 引数 なし 戻り値 Windowsが起動してから経過時間をミリ秒単位であらわした値 解説  すぐ上に書いてありますが、Windows が起動してから経過 時間をミリ秒単位であらわした値が返ってきます。 この関数の 存在意義は時間の計測にあります。 特定の時間を取得する事は この関数では出来ません。 //---------------------------------------------- つまりGetNowCount()関数を呼び出すと、Windowsが起動してから経過した時間が返ってきます。 「いつ値が入るのでしょうか」というご質問の意味がわかりませんが 示されたソースを見る限り「AtariHante()==1」となった時にstarttimeにその時の時間を入れているようですね。 と、同時に「 gstate = GAME_OVER 」にしています。 つまり敵なり敵弾なりに当たった時、ゲームオーバー処理に移行する。 その時の時間を記憶しておいて、ゲームオーバー処理で >if(GetNowCount() - starttime > 5000){ のように、再びGetNowCount()で最新の時間を取得し、 さっき記憶した時間(つまりゲームオーバーになった瞬間の時間)と 比較して5000ミリ秒(5秒)経過したかのチェックを行ってるものでしょう。
Re: タイマーによる画面切り替え ( No.2 )
名前:Nix 日時:2009/05/06 01:19

TK様 初歩的な所で躓いていたようです。 >示されたソースを見る限り「AtariHante()==1」となった時にstarttimeにその時の時間を入れているようですね。 >と、同時に「 gstate = GAME_OVER 」にしています。 つまり、if文の複数文の処理が終了してから次の処理に移行するんですね。 私はてっきり「gstate = GAME_OVER;」の次は「switch文」に進み、 次に「void DrawGameOver(ゲームオーバー処理)」 次に「starttime = GetNowCount();」の処理に戻るのだと勘違いしておりました。お、お恥ずかしい。 そうするとTK様が言われる事も理解出来ました。 おかげさまでやっと霧が晴れた気持ちです。 有難う御座います。

Page: 1 |