- ベストアンサー
Active Basic再描写処理で棒人間を動かすと爆弾がちらつく問題の解決方法は?
- 最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。
- 棒人間を動かすと、どうしても●がちらつきます。この場合は、どういう風に処理をすればいいのでしょうか?プログラムはこう書きました。
- InvalidateRect関数の二つ目のパラメータは、クライアント領域全体を再描写させるために指定されますが、なぜ『Byval 0』と表記するのでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 チラつくのは、BitBltの後にSleepを過剰に呼び出してしまっているからでしょう。 キー入力の方向に対応した人間をBitBltした後、爆弾をBitBltしてから、Sleepをかければ良いでしょう。 また、デバイスコンテキストは、可能な限り直に開放した方が良いです。 後、細かい事に言及すると、MainWnd_KeyUpイベントを処理してその中で、←か→のボタンが離されたら、BmpInfo=1として人間を普通の向きにしてあげると良いと思います。 「ByVal 0」に関しては、本来その部分にはRECT*と言うポインタが入ります。NULLを指定すると全体を再描画出来ます。 「NULLについて」 http://www.valley.ne.jp/~ryouga/machine/tips/c005.html まぁ、要は「0」の事です。 「ByVal 0」と書く理由に関しては(しかし、0である事位は容易に想像出来る)、当方もActiveBasicの事をもっと勉強してみないと名言は出来ません。 で、肝心なチラつき対策の方ですが、実際にActiveBasic5で試して見ました。以下参考程度に。 '再描画イベント(チラつき修正) Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) 'キーに対応した方向の人間の絵を選択 If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If '人間を描く BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) 'ボムの絵を選択 SelectObject(hBomDC,hBmp04) 'ボムの絵を描く BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) '先にデバイスコンテキストを開放した方がよい DeleteDC(hMemDC) DeleteDC(hBomDC) 'ココで休む Sleep(30) End Sub 'キーが離された時(追加) Sub MainWnd_KeyUp(KeyCode As Long, flags As Long) '←又は→が離された If KeyCode = 37 or KeyCode = 39 Then '普通の向きにしてから再描画する BmpInfo=1 InvalidateRect(hMainWnd,ByVal 0,TRUE) End If End Sub
お礼
なるほど・・・ DCは早めに開放しなければいけなかったのですか・・・ 勉強になりました! スリープの数ですね?早速試してみます。 ありがとうございました