今日は放課後に情報技術検定1級の補習があると聞いたので
顔出してきましたよ~
私は受けないので遊びに行ったようなものですがね!
補習担当先生が大変ユニークなので楽しいですよヽ(゚∀゚)ノ
それはともかく今日は昨日続きをがんばってみましたよ
ちらつく原因は爆発のアニメーションを仮想領域(メモリデバイス)に描画する関数を
子スレッドを作り各自勝手に動作させていたので
同期が取れず仮想領域から実際の画面に描画するタイミングがバラバラだったんですよねぇ・・・
爆発のアニメーションが重なってしまった場合
前の絵を消すために爆発の絵の周りの正方形を白く塗りつぶしていたんですが
先に描画した爆発の絵と重なってると・・・
・・・
って説明がメンドク(ry
各スレッドを同期させるシステムがいろいろAPIには用意されてるんですが
私が知ってるのはイベントとセマフォとミューティックスの3つだけ・・・
どれもこれもこの状況下じゃ有効に使用する方法が思いつかない!
ってことでこっちで勝手にフラグを立てて同期とることにしちゃいました(゚∀゚)
思いついたアルゴリズムは
各爆発アニメーションスレッド(以下スレッド)はまず1番目の爆発の絵(以下 絵)を
クリックした場所が中心となるようにメモリデバイスに描画します
※メモリデバイスに描画するだけなので実際には画面にはでません
1番目の絵の描画を完了したらそのスレッドは待機します(この辺はwhileを回して時間稼ぎ(゚∀゚))
ウィンドウプロシージャでは一定時間ごとにメモリデバイスから実際のデバイスへの描画を行います
※メモリデバイス(仮想領域)から実際のデバイスに描画するので目に見える形になります
しかし一定時間ごとに・・・とはいえ子スレッドでまだ1番目の絵が描画されてないいないのに
画面を更新してしまったらまずいですね
つーことで絵の描画が完了したかどうかの確認を取るフラグを各スレッドに持たせました
持たせました・・・と書きましたがスレッドが待機状態であるかどうかというフラグを
そのまま流用しただけですけどね・・・w
現在動いているスレッド全てのフラグが立ったら(全スレッドが描画完了し待機状態になった時)
画面を更新する
そしてメモリデバイスを全部真っ白に戻す
それが完了したら各スレッドの待機を解除します
そうすると各スレッドは2枚目の絵をメモリデバイスに描画を開始します
2枚目の絵の描画が完了するとそのスレッドは待機します
そして全スレッドが描画を完了し待機状態になったらまた画面を描画します
またメモリデバイスを真っ白に戻します
これをアニメーション終了まで続けます(゚∀゚)
これでなら重なってもちらつかずに描画されるだろう!
と考えたのでやってみました
うまくいきました(゚∀゚)
アニメーションが重なってもちらつかなくなりましたよーっと
ちょっとした問題もありますがこの辺は私のポリシー(?)的に許容範囲だったので無視w
@は爆発の効果音を入れたら終わりなのですが
これまたちょっとメンドイことに・・・
さらに効果音再生専用のスレッドを作ってあげるハメに・・・
これはそれほどややこしくありませんでしたけどね!w
あーそれともっといい方法知ってる人・・・思いついた人・・・是非教えてください
とりあえず今日は満足!ってことでOVER!!
今日の戯言:
次はどうしてやろうか