おっさん注意報
古のWindowsで趣味ゲームを開発していた人間が見たら懐かしすぎて憤死すること間違いなしのWIN32APIを集めてみた。
DirectX(もしくはWinG)を使わないアナクロな開発モデルのやつ。
なんとなく書きたくなって完全に記憶だけで書いているので、勘違いもあるかもしれない。
BitBlt
hDC間で画像の部分転送できるやつ。フラグを指定すればANDやOR演算ができるので、白黒のマスク画像を作ることでスプライト(キャラチップの背景透過処理)もできた。
DirectDraw(DirectX7まであったやつ)は、カラーキー転送ができたのでマスク画像は不要だったのが少しうれしかった。
あとDirectDrawの用語として、透過処理する色のことをカラーキーとMSDNに書いてあったので(私の周囲は)みんな徐々にカラーキーと言うようになったが、それ以前は抜き色って言ってた気がする。
BitBltは等倍転送だけど、拡縮できるStretchBltもあった。ただし汚い。98SEからハーフトーンで転送できるオプションフラグが加わって、見られる画質になったように思う。
sndPlaySound
wavファイルを再生するやつ。ASYNCフラグで非同期再生できるので、効果音(SE)の再生に使っていた。
通常は再生ファイル名をNULL終端文字列で渡すのだが、ポインタを渡してメモリに展開しておいたサウンドファイルを再生することもできた。
ただしVBでの開発の場合はポインタを扱えなかったので(アドレスを取得する隠し関数はあったが)ファイル名を渡すしかなかった。
mciSendString
BGM再生用。MIDIファイルとかCDDAの再生・停止ができた。ループ再生はできないのでメインループでちょいちょいstatusを確認してやる必要があった。
あと、9X系のOS(Windows 95, 98, Meとか)は呼び出した直後に再生が開始されたが、NT系(NT, 2000, XPとか)だとAPIをコールしてから再生開始まで数秒のラグがあった。
また機能的に同じことができるAPIにmciSendCommandがあったが、世の中のホームページ(重要)に掲載されていたサンプルコードの多くはsendstringであった。
関係はほぼないがCDDAは再生にCPUパワーをほぼ消費しないので重宝したし、大人向け商用ゲームでも2トラック目からCDDAでBGMを入れた構成になっているものもあった。
getTickCount, timeGetTime
いずれもWindowsが起動してからの経過時間をミリ秒で返すAPI。たしかgetTickCountのほうが軽かったが、分解能はtimeGetTimeのほうが良かったので(たしかgetTickCountは5~10msぐらいだった)、大体timeGetTimeを使っていた気がする。
ちなみに、timeGetTimeの分解能はtimeBeginPeriodというAPIで変更可能で、1msに変更する必要があった。
9X系のOSはデフォルトで1msだったが、NT系のOSはデフォルトが5msだったから。
これらを何に使っていたかといえば、当然メインループでのFPS調整処理である。
メインループといえば、WIN32APIのsetTimerは分解能としての保証値は確か55msだったのでゲームには使いものにならなかった。
sleep
メインループで余った時間をつぶすときに使うAPI。ms単位でsleepさせることができた。
空ループを回すという荒業もあったがCPU使用率が100%に常時張り付くのでお勧めできなかった。
一方でsleepはOSに処理を返してくれるのでCPU使用率を下げることができた。
ただしゲームの処理が完全にその間止まるので、3ms止めたいならsleep(3)ではなく、timeGetTimeなどで経過時間を見ながらsleep(1)を呼んでいた。
GetAsyncKeyState
キーボードの入力状態を非同期に取得するAPI。同時押下数に制限があった気がするが、キーボード側の問題だったかもしれない。
DirectInputだと全キーの状態を一気に取得できるので高速とか書いてあった気がするが、そもそもキーボード全体を使うゲームなんてそんなにないわけで、必要なキーだけこのAPIで状態拾った方が早かったように思う。
TextOut
文字を出力するやつ。デバッグ用。
矩形内に文字を折り返して収めてくれるDrawTextとかいうのもあった気がするが使った覚えはない。
昔はフォントにアンチエイリアシングがかかってなかったので、サウンドのベルとかを作る場合は自前でアンチエイジングの処理とかを作ってた(倍のサイズで文字を打ち出し、平均画素法で縮小するなど)。
おわりに
だいたいぱっと思い出せる、よく使っていたAPIだとこんなところ。
思い出話は腐るほどあるけど、同時代にゲーム作ってた人ならあったあった的なリアクションをしてしまうラインナップをとりあえず出せたのではないかと思います。
・・懐かしでいえばDirect3D RMモードとかね。