ページ 11

すべてのカウンターを止めるには

Posted: 2010年3月31日(水) 23:53
by no
現在、シューティングゲームを動作するうえで、いくつものカウンターを使用しています。
そこでQキーを押すことで、黒い画面を描写し、すべてのカウンターを停止させようとしましたが、予想通りの結果が得られません。個人的にWaitKey();関数を用いればいいと思ったんですが。
void teki_state(){
    if(KeyBuf[KEY_INPUT_Q]==1){
        DrawGraph(0,0,enemy_data.blackimg,FALSE);
        WaitKey();
    }
}
//enemy_data.blackimgにはすべてを覆うサイズの黒い画像を格納しています。
上記の関数を通すことで、

「Qキーを押す→黒い画面が描写→キーが押されるまで動作停止」

という動きを期待したんですが、動作はとまるものの、黒い画面が描写されません。
で、停止中にもう一度Qキーを押すと黒い画面が描写され、動きも停止します。

二回押さなければ予想通りの動きがしない理由がいまいちわかりません。
予想通りの動きとは、6行上に書いたカッコ内部の動作です。

環境はwindowsXP,コンパイラはVC2008です。

Re:すべてのカウンターを止めるには

Posted: 2010年4月01日(木) 00:19
by kazuoni
関数ScreenFlipを通っていないからです。
キーを押せば、恐らくその後に描写しているのかと。
なので、関数WaitKeyではなく、キーが押されるまで空ループするなりで
対処してみてください。

Re:すべてのカウンターを止めるには

Posted: 2010年4月01日(木) 00:35
by y
WaitKey関数は、元々メインループも作らないような、ちょっとしたテストの為の関数です。
使うと、その時点でメインループ自体が止まります。
つまり、カウンタ変数どころか、プログラムの処理自体が止まります。

画面に実際に表示されるのは、ScreenFlip(ScreenCopy)が呼び出されてからなので、WaitKeyの時点では画面に表示されることは無い、ということです。

解決策ですが、全ての構造体のカウンタは、止めたいというからには恐らくどこかで更新してるはずです。
その更新を止めればいいだけです。


あまり詳しく言っても勉強にならないのでここまでです。すみません。
あとは、入力の判定を工夫するとうまくいくと思います。

Re:すべてのカウンターを止めるには

Posted: 2010年4月01日(木) 00:51
by no
なるほど、当然の話ですね。
完全に失念していました、ありがとうございます。

Re:すべてのカウンターを止めるには

Posted: 2010年4月01日(木) 15:43
by 舞桜
ScreenFlip()関数は厳密には、表裏描画するときにはじめて使えます。

描画先をBACK_SCREENにしていれば、画像は画面に描画されるので、
その画像を可視できる状態にするためにはScreenFlip()で、
表と裏の画面を切り替える必要があります。
描画先が前面である場合は、画像が前面に描画されるので、
ScreenFlip()を呼ぶ必要はありません。