2005年08月27日
2時間プログラミング - プログラム
今日の部活で、部長が後輩に30分でテトリスを作れといいおった。
実際、作れんのかということで、俺と部長が別々に実装してみることに。
それが悲劇の始まりだった・・・。
ひとり、またひとりと減っていく部員・・・。
消えていく電灯・・・。
降りるシャッター・・・。
部活終る予定時刻より大幅に遅くなってしまって、部員は3人しか残らず、電気も消えちゃったっつー話。
ってか、自分がいつも使うプログラムのフレームワーク(雛形)を使えば、30分で実装できる自信はあるんだけど。
今回はコンソールのプログラムで、しかも何も無いところから全部手打ち。マンドクセ('A`)
どうせ途中で終るだろうと、やる気無くカタコト打ってたら、向こうの方からすげーパワフルな打キー音が聞こえてくる。
ぶ・・・部長はやる気だ!
ってことで、俺もやる気だしてパワフルなキーボード破壊音を炸裂。
2時間程度の格闘の末、とうとう完成。いちおう遊べるだけ。点数とかOP画面とか一切なし。
特にキー入力に手間取りました。
普段、自分の昔作ったフレームワークに頼ってるので、キー入力系の記憶は完全に失われてました。
しかも、押しっぱなしだと反応し続けるという辛さがあります。
フレームワークのキー入力周りは変化(キーが押された・放された)を検出してますが、今回のは押されているかという状態のみで判断してるもんで・・・。
230行テトリスと7行テトリスには遠く及ばないけど・・・。
同じような処理が5箇所にもわたって書かれてるのもあるし、関数化すれば200行は切るだろう。
もっと、最初に考えてから組まないと、グダグダな結果になるなぁ。
しかし、この簡単なパズルゲームを2時間程度で実装するってのは、プログラムのリハビリに最適かもな。
覚えとこう。
2005年05月21日
ゲーム音楽 - プログラム
自作ゲームプログラム用の音楽を6つほど頂きました。
ほんと、これがTVゲームで普通に使われてても違和感が無いと思えるくらいレベル高いんだけど、
RPG向けなサウンドなので、タクティクス系の戦術シミュレーションを作ってる自分としては、使いどころが難しいところ。
しかしながら、OP用の曲、ED用っぽい曲、戦闘用の曲といろいろあったので、その辺はカッチリはまりそうです。
あとの3曲もちゃんと生かせる雰囲気にしないとね。
音楽を貰ってやる気が出たので、プログラムに取り組みました。
いつも、金曜日の部活の時間に進めているけど、今週は部活無かったから。
しかし、設計は決まっていくのに、実装するために手が動かない。
もうちょっとモチベーション整えるべきかな。
続けてコツコツとプログラムできる人がうらやましい。
一気にぐわーってやらないと、集中力が持続できません。
情熱が足りない。
2005年05月10日
プログラムのコンテンツ - プログラム
そういえば、そんなコンテンツを考えてたり、書いてたりしたけど、うやむや化している。
友達に「見てた」といわれて初めて思い出したわけですが、前に書いた内容には実は問題があった。
でも放置してた。
だめだなぁ・・・まぁいいか。
問題ってのは、位置検出の実装部分なんだけど、タスクバーのサイズを使って位置を検出していた。
でも、実はXPのタスクバーは +2だとか-2だとかのWindowサイズとのズレが存在しないらしい。
開発は2000でやってたから、気づきませんでした。
ってことで、修正しようと思って直し方を悩んでたら、とてつもなく簡単な方法があった。
というよりも、見落としてた。
SHAppBarMessageという関数で、APPBARDATA構造体にタスクバーの座標位置情報をセットさせていたわけだが、その際に上下左右の位置情報までセットされていたというのだ。
Ω ΩΩ<な、なんだってー!?
リファレンスが英語だったので、微妙に流し読みしてたのがまずかった。
APPBARDATA構造体にはuEdgeというメンバがあって、そいつの説明が。
Value that specifies an edge of the screen. This member can be one of the following values:
ABE_BOTTOM Bottom edge.
ABE_LEFT Left edge.
ABE_RIGHT Right edge.
ABE_TOP Top edge.
ということだったのです!!!ってコピペしたけど読めてねぇよ。
えーと、要するに画面の端を保持するもんで、下の4つのどれかの値を持ってます。ってことらしい。
だから、これを使えば位置情報の取得なんてお茶の子さいさいへのカッパ(古い)です。
無理やり、変なルゴリズムで実装しようとせずに、機能が提供されていないかしっかり調べるべきなようです。
まぁ、マイナーな機能の場合、提供されてるAPIがバグってたりして怖いんだけど。
2005年04月21日
メッセンジャー - プログラム
プログラムのことを前から書こうと思ってたけど、Blogでやるより、そういうページ作るべき だなんて考えが先行してた、でも実際ネタがない。
調べればどこかですぐ見つかるような事を書いても意味がないし、調べても見つからないようなモノはあまり作ってない。
でも、なんか作り出したので書いていこう。
(C++のWindowプログラムで作りたいソフト開発出来る人対象。そんな人は現状で読んでいない。)
メッセンジャーというソフトがある。
MSNやらYAHOOやらあるけど、あの通知のシステムは結構便利だと思う。
タスクバーに常駐して、通信があればメッセージを表示する。
いずれ、今つくってるネットワークが関わるゲームに、ユーザーのオン・オフだけでも見れる機能をつけたいと思っていたけれど、それの片鱗に触る機械があったので、忘れないうちに書いていこう。
タスクバーに常駐するなんてのは、どこにでも解説されてることなので割愛するとして、メッセージはどうだろう。
タスクバーの各位置から、にゅにゅにゅっと出てくるアレは何で作るべきなのか。
結論から言うと、自分はアレをウィンドウとして作った。
ただウィンドウを作るだけだと、周りの線があったりして邪魔。
ウィンドウを作る時に指定するパラメータをちょちょっといじれは、真っ白で四角いウィンドウが作れる。
そのパラメータが『WS_POPUP』だ。
MSDNの記載では「ポップアップ ウィンドウを作成します。WS_CHILD スタイルと一緒に使うことはできません。」とある。
このポップアップウィンドウってのは、ユーザーに情報をッパっと表示するためのウィンドウで、枠もタイトルバーも×ボタンも無い。
このパラメータを、CreateWindowやCreateWindowEXのスタイルとして指定してやれば、まっしろで四角いウィンドウを表示できる。
どんなウィンドウを表示すればいいのかわかった。ニュニュって出るのもサイズを変更すればいいわけだから、SetWindowPosか何かを使えばいい。
じゃぁ、コレで完成かといえば、重要な作業が残っている。
表示する場所の指定だ。
一般的な人のPCならタスクバーは下にあるけど、みんながみんな下に設定しているわけじゃない。
特にマカー出身だと上にタスクバーを置く人だって居るし、横にだって出せる。
それに、タスクバーはXPとクラシックでは厚みが違うし、2段や3段にしてる人もいる。
何がわかれば、ちゃんとした位置に表示ができるのか?
答えはタスクバーの位置とサイズだ。
それを得るためにはSHAppBarMessage関数を使う。
これにABM_GETTASKBARPOSというタスクバーのポジションを得るためのオフセットと、入手したポジションを記憶するためのAPPBARDATA構造体のポインタをわたす。
すると、APPBARDATA構造体の中にあるRECT構造体に位置がセットされる。
タスクバーの各座標がそのまま構造体の要素になる。
そして重要なのが、タスクバーのサイズは2ドットはみ出ているということ。
見えない部分に2ドットはみ出ているので、例えば
top=924,bottom=1024,left=-2,right=1026 ってな感じ。
この特性を使えば、topが0であればタスクバーが上にあるという単純計算で位置が算出できる。
その関係は以下の通り。
・leftが0よりも少なければ、左右がはみでているので上下のどちらか。
・topが0ならば上、そうでなければ下。
・leftが0未満でなければ、左右。
・leftが0なら左、そうでなければ右。
方法はこれ以外にもあるので、決定的な関連情報じゃないけど、まぁ十分判定できるのでこれを使う。
上に書いてきたことを使えば、ニュニュっと出てくるWindowが作れる。
気をつけないといけないのは、生成したWindowがメッセージの表示を終えて見えなくなったとき、プログラムからウィンドウを削除してやらねばならない。
タイトルバーについている×ボタンが無いのでユーザーが閉じる作業ができない。
もし、×ボタンをつけたけば、CreateWindowのスタイルを0にすれば、タイトルバーが出るので使うことも出来る(はず。)
あとは、タスクバーのアプリケーションの表示にウィンドウがでないようにすることくらいか。
その辺は、ツールバー化するスタイル使うとか、非表示のウィンドウの子にするとか方法はあるようだけど、まだ試して無いので後日。
しかし、やっぱりBlogだと自由度に限界があるな。
結局、HTMLに書き直すことになりそう。
専用ページを作ったらソースをアップするつもり。