ちらちら
また、小さいゲームを作っています。蛇ゲーム ( ? ) っぽい何かを作っています。
今日は SetPixel でちらつく問題が解決できたので、その方法についてメモ。
蛇の尻尾の部分を SetPixel で描いていたのですが、それが長くなるにつれてちらつくちらつく。何かいい方法はないかなと思い、探してみたところ「ダブルバッファリング」という方法を発見しました。
なんでも、バッファを二つ用意しておいて、描画してあるのを入れ替えるのだとか。描画するときに一瞬、背景が見えるからちらつくのだとか。そんな感じのよくわからないことが書いてありました。おまけにソースが Java 。わたしは C + SDK なので、コンポなんとかのほげほげとか書かれてもわかりません。Java ではライブラリにそういうものがあるのでしょうか。とにかく、理屈の上ではわかったので、あとは実現にむけて努力するのみです。
で、自分なりに考えて、それっぽいものを作ってみました。
CreateCompatibleDC で画面と互換性のあるメモリデバイスコンテキストを取得。CreateCompatibleBitmap で画面と同じ大きさのビットマップを作成。SelectObject でメモリデバイスコンテキストをビットマップと同じ形式(?)に。以前は画面に描画していたものを代わりにそのメモリデバイスコンテキストに描画。 最後に BitBlt でメモリデバイスコンテキストから画面へ転送。
これでいいのかはわかりませんが、ちらつきが減った(消えた?)ようなので解決したことにしました。
成長過程メモ
オブジェクト指向プログラミングでググって上の方にでてきたサイトでいいなと思ったサイトがあった。私のプログラミングスキル*1はこのページの3ページ目の頭くらいだと思います。グローバル変数を自由に変更できないように(?)、モジュールを分割するようになったあたりです。
私の今のやり方はこうです。まず、だだーっと一枚のソースにグローバル変数バリバリで書いて、管理しきれなくなってきたところで、モジュール分割。グローバル変数だったものを、別ファイルで static にして操作用の関数を公開。nigaimはこのやり方で作りました。(小さいから、こんなやり方が通じたのかもしれません。このあたりはもっと色々試してみないとわからないです)
今まで以下のような流れで来ました。さて次はなんでしょうか。
STL や インスタンス あたりかなと思っているのですが。どうなるんでしょうかね。とりあえず、成長過程をメモ。
*1:追加の注釈。こんなのがスキルの尺度になるかはわかりませんが、なんとなくの目安になればと思ってこんな風に書きました。
nigaim version 0.5 公開 ( バグ修正版 )
昨日、公開した nigaimですが、いくつかのバグと修正すべき点が見つかりました。
現在分かっているのは以下の6つ
- 誤って終了してしまう ( メニューが使いにくい )
- タイトル画面の再描画がされない ( WM_PAINTの処理がされていない )
- 死角がある ( テスト版(公開していません)では、これをうまく使うと 20000点以上取れる )
- ランキングの3位が正しく更新されていない
- ランキングが保存できない ( 起動されるたびリセットされるのは嫌 とのこと )
- 得点の最大値が低い ( 9999 より大きい点を一度に取ると加算されない )
本当はあれで完成のつもりだったので、バージョンもつけていなかったのですが、つまらないゲームをつまらないバグでさらにつまらなくしてしまうのもあんまりなので、修正しました。
バージョンは、前回を 0.1 、今回を 0.5 としました。
nigaim 公開
4日しか空いていないのに、すごくひさしぶりな気がします。忙しかったせいかもしれません。さて今日は、cltcの安定版や配布サイトを作らず、頼まれているサイトも作らなかった私が何をしていたか。その結果を公開したいと思います。
結論から言うと、ゲームを作っていました。
といっても、プログラミング初心者の私に作れるものですから、たかが知れています。なので、目標は低めにフリーセル。フリーセルをするくらいの気持ちでできるゲームを目指しました。
そして完成したゲーム。名前は「nigaim」 敵を消しつつ弾をよけるゲームです(readme.txtより)
イメージを説明すると、もぐらたたきのもぐらが、弾を打ち出してきます。その弾は斜め方向のみなので、一度避けるのは容易いのですが、画面内をいつまでも反射し続けます。もぐらを倒すと弾の数だけ点数が入ります。とこういう感じです。
できれば一度プレイしてみてください。
追記: 修正版(0.5)が出ています
メモリ使用量にこだわりすぎるのはやめます。
メモリ使用量について調べてみた。理由はタスクマネージャに表示されるメモリ使用量はどうもアテにならない気がしたから。参考になったのはこのページ Process Explorerを使いながらメモリ使用量について色々書いてあった。
Process Explorer で fenrir (Ver.0.54a)を見てみた。Working Setは異常に小さいけど、 Virtual Size は cltc と1Mの差だし、 Private Bytes は cltc より 2M 多かった。Working Set以外は大して変わらないなと思った。
もしかしたらと思い、cltc を閉じる(終了ではない)ときにSetProcessWorkingSetSize()を使ってみたら、非アクティブ時のWorking Setが 500K 程度になった。きっと「最小化したときにメモリ使用量がガクッと減るアレ」を手動で起こしてるんだと思います。
バカにされた気分ってきっとこういう状況のことを言うんでしょうね。NT系なら、たった一行書き加えるだけでタスクマネージャでのメモリ使用量を減らせるって……こういうのを見て一喜一憂してたと思うとバカらしいです。
512MB積んでるノートで試しているのですが、タスクマネージャの表記以外に、この動作に意味があると思えないです。NT系の方で、この動作をするものが欲しい方は言ってください。いつでもあげます。
メモリ使用量にこだわりすぎるのはやめます。
プログラミング Windows を買ってみた
プログラミング Windows を買ってみました。
ペゾルド本(?)*1ってやつですね。さっき読みはじめて、70ページあたりまで読みました。今のところの感想は、もっと早くかっときゃ、時間のムダをせずに済んだなといった感じです。
いろんな道をたどった結果たどり着いた tchar.h も第2章ですよ*2。ヘッダファイル読んでた自分がバカらしくなります。ただ、そういう遠回りをしているからこそ、こういう風に、まとめられている状態をありがたく思えるのかも、そう思うようにしています。