第13章 プログラマー歴実質1年の僕がWindowsとC++でプログラミングをしたかった話

75回生 RLtdExp

Windows APIは、WindowsのOSの各機能を、アプリから使えるようにしたものです。これにより、皆さんが普段目にするアプリケーションが開発されています。

現在は、.NET Frameworkという環境が整っていますが、.NET FrameworkもWindows APIを使って作られており、.NET Frameworkでサポートされていない機能を使うには、Windows APIを知らなければなりません。

しかし、16ビット版からの度重なるアップデートにより、互換性を失ったプログラムが動作しなくなるなどのことがあったほか、非常に複雑になってしまい、覚えにくくなっています。私も挫折した一人です。私が使っているC++でのプログラムは以下のようになります。

リスト13.1: hoge

#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
        MSG msg;
        <処理>
        return msg.wparam;
}

まずここで、「HINSTANCEとかLPSTRってなんだよ」となりました。プログラミングの経験がある人は、intcharlongといった型を知っているかと思いますが、HINSTANCELPSTRはWindows API独自のものです。

私が初めにつまずいたのが、これにかかわるものでした。ウィンドウを作る関数(決まった処理をするコード)のCreateWindow()の説明に、引数(関数に渡すデータ)の説明として

  • ウィンドウクラスの名前
  • ウィンドウの名前
  • ウィンドウのスタイル
  • 初期X座標
  • 初期Y座標

…となっていたので、第一引数に、C++言語に基づいて"Hoge"(char型の配列)と書いたところ、「char*型のデータをLPCTSTR型に変換することはできません」といわれ、動作しませんでした。

キャスト(型を強制的に他の型に変える)でも駄目でした。一つ目の挫折です。ネット上からサンプルプログラムを探したところ、みなさんTEXT("Hoge")と書いていたり、_T "Hoge"と書いていたりしました。

どうやら、LPCTSTR型というのは、使用文字コードによって違うようで、TEXT()は、#define TEXT(S) _T Sもしくは、#define TEXT(S) Sと定義されており、使用されている文字列の方にキャストしてくれるマクロだったようです。

おそらく、互換性の観点からこれを使うのがよさそうです。

次に、メッセージ処理についてです。

MSG構造体は、メッセージを受け取る型です。WindowsプログラムのWinMain関数は、基本的にMSG構造体のwparamメンバーを返さなければなりません。この値は、めったなことがない限り0(異常なし)です。

……と、かなり難しかったため、拡張ライブラリの「DXライブラリ」を使い、開発を始めました。が[Windows SDK○○が存在しません]とエラーが出てしまいました。原因は、私の使っているVisual Studio 2017に、DXライブラリで使用しているWindows SDKが入っていなかったためでした。

SDKをインストールして、さあ起動!しかし

[○△□がありません]
[○△□がありません]
[○△□がありません][エラーが多すぎます。これ以上は表示できません]

嘘やん…何で…

もう一度サイトを確認すると…「Windows .exeアプリケーション」のところを変更してください」と書いていました。

どうやら、アプリケーションのタイプを間違えており、ライブラリが不足していたようです。というわけで、DXライブラリでゲーム開発をやってみることにしました。

ゲームを作っていくうえで学んだことを述べていこうと思います。まず、数学についてです。

主に、関数とグラフのところを理解している必要があります。円運動や当たり判定をさせるときに三角関数があると便利です。

C言語系統では、「math.h」という拡張ファイル(ヘッダーファイルといいます)に、いろいろな数学関数が入っています。例えば、正弦を求める「sin(double θ)」や、その逆関数の「asin(double θ)」などです。

これらの数学関数を駆使して、キャラクターなどの動きを制御します。

次に、最適化についてです。

どんなすごいプログラムを作っても、動かなければ意味がありません。できるだけ無駄を省き、より性能の低いパソコンでも使えるようにしなければなりません。

そのためには、どの部分が無駄か、どの部分が必要かを見極めなければなりません。例えば、全く使っていない変数や関数などです。これらは、メモリを無駄に食いつぶし、動作を遅くする原因となります。そのため、コードから削除することで、動作を軽くできます。

また、どうしても重いときは、余計なエフェクトを抜く、または、高性能パソコンでのみエフェクトをつけるようにすることも必要です。

13.1 あとがき

今回、Windowsプログラムを作る上で、たくさん挫折を体験しました。また、いろいろなことを学ぶこともできました。

皆さんもパソコン研究部の展示や部誌を見て、多くの方にプログラミングについて知ってもらえるとありがたいです。