VisualC++でSDLゲームプログラミング!!

〜.NET Frameworkに依存しないソフトを作る方法についてのまとめページ〜
〜SDLで音声ファイルを扱うときの注意点も〜


(2010/8/24 更新)

本ページでは、無償版VisualC++とSDLでゲームプログラミングをする環境をつくるまでの流れを
ひとつのページにまとめています。
現状では まだXPが主流であることを考えて、
ランタイムに依存しないソフトをつくる方法についても紹介します。

ランタイムのない環境ではエラーメッセージが表示されて起動できません。
「msvcr80.dllが見つからない」
「アプリケーションを正しく初期化できなかった」
「ファンクションが間違っています」「構成が間違っています」など、
メッセージは一貫していませんが、
いずれにしてもmsvcr80.dllとの依存関係を断ち切れていないことが原因です。

ついでに、SDL_Mixerが若干ポンコツであるため、エラーの回避策についても触れておきます。

ステップ1: Visual C++ 2005 Express Editionをインストールする

ステップ2: Win32プロジェクトを作れるようにする

ステップ3: SDLを導入する

ステップ4: DirectX SDKを手に入れる

ステップ5: SDLを自分でビルドして作る

ステップ6: プログラムを組んで、さっそくビルド

無事にビルドできましたか?

ライブラリ依存関係を調べる

補足: 起動するとパソコンがうなりませんか?

補足: SDL_Mixerの不具合について

おまけ: オープンソースという選択


ステップ1: Visual C++ 2005 Express Editionをインストールする

ネットからダウンロードすることもできますが、
本屋でVisualC++の参考書を買ってくるのが手軽だと思います。
付属のCDを使えば、一発でインストール作業が済みます。

ステップ2: Win32プロジェクトを作れるようにする

おそらく、ウィンドウ型のアプリケーションは作れないように なっていたのではないでしょうか。
無償版では作れないとも言われていますが、
実は 方法があります。
以下のページをよく読んで、Win32プロジェクトを作れるように準備をしましょう。
下側の方が説明は詳しいです。

C++2005 Win32 アプリケーションを作成する準備
VisualC++ Expressについて


ステップ3: SDLを導入する

SDLとは、ゲームプログラミングをやさしくするためのツールです。
しかし、本当の狙いは、ゲーム機器も含めた 異なる機種・OSへの移植をスムーズにすることです。

なので、GUIや文字入出力は 原則 使えないものとして考えてください。
それを使ってしまうと、何らかの依存性が生じますし、
ゲームソフトとしての見栄えも悪くなります。

SDLの導入の仕方など、詳しくは以下のページを見てください。

初心者の初心者による初心者の為のSDL


ステップ4: DirectX SDKを手に入れる

普通のやり方では、.NET Framework2.0の無い環境で動かせるソフトは できません。
この問題については、SDLを自分でビルドして作るという解決法があります。
そのためには、まずDirectX SDKを用意しなければなりません。

以下のページからダウンロードできます。
「continue」ボタンを押すとダウンロードページに移ります。

Download Details: Direct X SDK

400MB程度のexeファイルがダウンロードされます。
これを実行して、インストールしてみましょう。
インストール先のフォルダをのぞいてみると、
「Includeフォルダ」と「Libフォルダ」があります。
必要なものは、この2つだけです(13MB程度)。あとは、いりません。
Libフォルダの中のx64フォルダも、特に必要ありません。

そうしたら、Platform SDKやSDLの時と同じように、
VisualC++から参照できるようにします。




フォルダの保存先を指定してくださいね。


ステップ5: SDLを自分でビルドして作る

SDL公式サイトからソースコードを手に入れたら、
以下のページの説明にしたがって、ビルドしてみましょう。

SDLをビルドする

なお、SDLとSDLmainのそれぞれをビルドする前に、
次の操作を行っておいてください。
「プロジェクト」->「プロパティ」->「構成プロパティ」->「C/C++」->「コード生成」。
「ランタイムライブラリ」の項目が「マルチスレッド DLL (/MD)」になっているところを
「マルチスレッド (/MT)」に変えます。



以降は、ここで作成されたSDL.lib及びSDLmain.libを使うようにしてください。


ステップ6: プログラムを組んで、さっそくビルド

プログラム文が書けたら、さっそくビルドするよ〜!



ここでも、ビルドする前に「マルチスレッド (/MT)」に変えておきます。



「/MD」は .NET Frameworkランタイムに依存させるモード、
「/MT」は依存させないモード、というようになっています。
依存しないモードでは、ランタイムの分をexeファイルの中に含めてしまうため、
その分だけ、exeファイルの容量が大きくなっているはずです。
大きくなるといっても、数百KB程度なので、気にしなくていいです。


無事にビルドできましたか?

SDL公式サイトで与えられているVisualC++用の完成品は、
「マルチスレッド DLL (/MD)」でビルドされたものです。
「/MT」でビルドするときに、関数名が競合するといったエラーが出るのは、
「/MD」で作成したライブラリ(lib)と混ぜて使おうとしたことによります。

参考ページ
Cランタイムライブラリ(CRT)


ライブラリ依存関係を調べる

本当にランタイムに依存しないexeファイルを作れたのかどうか、
それを確認できるソフトが、これです。

Dependency Walker



目的のexeファイルを開くと、DLLファイル名の一覧が出力されます。
その中に「MSVCR80.DLL」というような名前のものが見つからなければ成功です。
(数字の部分は異なっているかもしれません)
(MSVCRT.DLLという似た名前のものは問題ありません。
exeファイル内に組み込まれているものです。)

もし、設定を「/MT」にしてビルドしたはずなのに、
「MSVCR80.DLL」の名前がある場合には、
ほかに自分で「/MD」でビルドして作ったlibファイルが無かったか思い出してみましょう。
そして、それをインクルードしてプログラム文の中で使っていないかどうかを確認してください。

補足: 起動するとパソコンがうなりませんか?

起動すると始終パソコンがうなり声をあげるフリーゲームは、けっこう多いですが…
「タスクマネージャ」で調べるとCPU使用率が50%もあったりします。
原因はツールがどうとか言うよりも、プログラミングが下手なことです。

まず、アニメーションにウェートをかけたい時は
必ずSDL_Delay()を使いましょう。
for文やwhile文でウェートをかける方法はおすすめできません。

描画の重さもパソコンをうならせる大きな原因です。
描画を高速化するには、
無駄な描画処理をできる限り省くようにプログラムすることが
一番有効です。

何度も上書きすることを防いだり、
変化する部分だけを描画するなど、工夫をしましょう。
また、大きい領域をアルファブレンド(透明色)で描画するのも、
描画を重くする要因だったりします。

SDLでもDirectXを使いたいという話もありますが、
逆に描画が恐ろしく重くなるので、使わないほうがよいです。
標準設定でのwindibのままで どうぞ。
(SDLを介さず直接DirectXを使えば、まあ速いと思います。
ただ無駄のない描画プログラミングをDirectXに任せられるというだけの話で
高速描画には絶対必要というわけではありません。そこらへんは、お好みで)


補足: SDL_Mixerの不具合について

SDL_Mixerで簡単に音声ファイルを扱えると言われていますが、半分ウソです。
現在のSDL_Mixerのバージョンにバグが存在しているためです。
それでも、バグの発生条件を理解しておけば、まあまあ使えるとは思います。

  • MP3形式
    基本的には問題なく動作します。
    ただし、音声ファイルの「周波数」に気をつけないと再生速度がおかしくなります。
    Mix_OpenAudioで44100と指定したのなら、再生するファイルも44kHzでなければいけません。

  • OGG形式
    再生時間の短いものは、次のような問題を起こすことがあります。

    「SDL_Mixerで読み込み時にエラーが起きる」
    「音がおかしくなる」
    「逆に容量が大きくなる」

    目安としては、6秒以上ならOGGでも大丈夫でしょう。
    それより短いものはWAVのままにするなど、使い分けが必要です。
    ついでに、ネットで出回っている形式変換ソフトはエラーの出るものが多いので
    慎重に選んでください。
    Rip!AudiCOは正常に動作しています。

  • WAV形式
    特に問題ありません。


    おまけ: オープンソースという選択

    オープンソース、それは、
    ソフトウェア開発技術の発展に資するべく、
    ソースコード(プログラム文)を一般公開することである!

    ひとりで完璧なソフトに仕上げる自信がなくても、
    ベータ版のオープンソースとして公開してしまうという選択もあります。
    この際、画像や音楽などのデータも丸見え状態にしてしまえ!
    そんな開けっ広げな製作スタイルも有りだと思います。



    今や、ゲーム会社に勤めなくてもゲームクリエイターに なれる時代。
    何につけても、大事なことは基礎をしっかり勉強することです。
    フリーソフト業界の今後の更なる発展を祈る。