新 「ゲームプログラマになる前に覚えておきたい技術」 VS2010対応


「ゲームプログラマになる前に覚えておきたい技術」に付属しているソース類で、
VisualC++2010用に変換したプロジェクトおよびソースコードを用意してみました。手元の環境でデバッグ/リリース構成のビルドを確認しています。2011/02/09 にファイル群を更新しました。
2011/07/08 にファイル群を更新しました。
Windows Vista/7上でのヒープ破壊メッセージに対する対処を入れてあります。

プロジェクト変換について

  • ライブラリの全体最適化を無効化してあります。
  • ワーニングレベルを3に落としたものがいくつかあります。
  • 算術関連(sin,cos,tan,など)を名前空間付きに変更しました。

サンプルコードによっては、全体最適化適用による不具合のため、
exe用のプロジェクトでも無効化してあるものがあります。

なお、変換に用いたのはVisulStudio2010Professionalです。
ですが、expressエディションでも開くことは可能かと思われます。

■使用方法

CDROM内にある、VisualStudio2008用のソースコードを展開した後、
srcフォルダでダウンロードしたファイルを上書きで展開してください。

書籍で解説されている各サンプルをVisualStudio2010環境で使うには、
さらに以下の手順による準備が必要です。

*VS2010用に準備する!

src/GameLibs内の各フォルダにある *.slnファイルらを
DebugとReleaseの両方でリビルドします。
ただこれには順番も関係しており、以下の手順でリビルドを行っていきます。

  1. Modulesフォルダ内 Modules.slnを開きます
    1. メニューからビルド → バッチビルドを選択
    2. “全て選択”ボタンを押す。全てにチェックが入ります
    3. “リビルド”ボタンを押します。
      1. リビルドが開始されます。
  2. それ以外のそれぞれのフォルダのGameLib.slnを開いて、ライブラリをビルドしていきます。
    1. 2DActionGame
    2. 2DGraphics1
    3. 2DTransform
    4. 3DCollision1
    5. 3DGraphics1
    6. 3DHardware1
    7. InputDevices
    8. Loading
    9. RealTime
    10. Sequence1
    11. Sound1
    12. Sound2
    13. Final

これでそれぞれのサンプルプログラムを開いて、
書籍で説明されているステップを進めていくことが出来るようになります。

注意事項

公開しているアーカイブの再配布を禁止します。
また、公開したアーカイブを使用したことによる損害については、
筆者および公開した私自身がその責務を負いません。
利用する際には、自己責任でご利用下さい。

ダウンロード

ゲームプログラマになる前に覚えておきたい技術 2010対応 注意事項に同意の上、ダウンロードしてください。

2012/09/02現在 VisualStudio 2012版のプロジェクトも用意しました。
それはこちらになります。  → http://blog.techlab-xe.net/archives/1296

動作確認環境

  • Windows7 Ultimate x64環境
  • VisualStudio2010Professional/VC2010 Express
  • PentiumDualCore E6500, Core i7 860
  • Geforce9800GT, RADEON HD 5450

この環境で、含まれるサンプルソースコードの実行等を確認しております。
少なくともこのプロジェクト類を用いて 64bit環境での動作を確認できております。

エラーメッセージについて

このようなエラーメッセージが出た場合には、
そのサンプルプログラムが必要とするGameLib.lib, GameLib_d.lib が
VisualStudio2010でビルドされていないことが理由です。

前に説明したリビルドの部分を確認してみてください。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする


コメント

  1. fujianaka より:

    はじめまして。質問なのですが、ここに書いてある方法でサンプルファイルを2010用に変換しようとすると、「リビルドにすべて失敗しました」と出てしまい、リビルドができません。この場合はどうしたらよいのでしょうか? 作業環境はWindows7Professional、VC2010expressです。

  2. slash より:

    リビルドの失敗についてほかにはどのようなエラーメッセージがでていますか?

  3. fujianaka より:

    VisualStudioの出力ウインドウに出てきたエラーはこう出てきてました。
    srcBasePrimeNumber.cpp(260): warning C4127: 条件式が定数です。
    Thread.cpp
    C:UsersakikoDocumentsGameLib2010srcGameLibsModulessrcThreading/ManagerImpl.h(72): warning C4127: 条件式が定数です。
    C:UsersakikoDocumentsGameLib2010srcGameLibsModulessrcThreading/ManagerImpl.h(90): warning C4127: 条件式が定数です。
    srcWindowCreatorWindowCreator.cpp(312): warning C4127: 条件式が定数です。
    C:UsersakikoDocumentsGameLib2010srcGameLibsModulessrcThreading/ManagerImpl.h(72): warning C4127: 条件式が定数です。
    C:UsersakikoDocumentsGameLib2010srcGameLibsModulessrcThreading/ManagerImpl.h(90): warning C4127: 条件式が定数です。
    LINK : fatal error LNK1181: 入力ファイル ‘dxguid.lib’ を開けません。

    c:usersakikodocumentsgamelib2010srcgamelibsmodulessrcwindowcreatorwindowcreator.cpp(312): warning C4127: 条件式が定数です。
    c:usersakikodocumentsgamelib2010srcgamelibsmodulessrcthreadingmanagerimpl.h(72): warning C4127: 条件式が定数です。
    c:usersakikodocumentsgamelib2010srcgamelibsmodulessrcthreadingmanagerimpl.h(90): warning C4127: 条件式が定数です。
    c:usersakikodocumentsgamelib2010srcgamelibsmodulessrcbaseprimenumber.cpp(260): warning C4127: 条件式が定数です。
    c:usersakikodocumentsgamelib2010srcgamelibsmodulessrcthreadingmanagerimpl.h(72): warning C4127: 条件式が定数です。
    c:usersakikodocumentsgamelib2010srcgamelibsmodulessrcthreadingmanagerimpl.h(90): warning C4127: 条件式が定数です。
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(C:UsersakikoDocumentsGameLib2010srcGameLibsModuleslibModules.lib) が Library の OutputFile プロパティ値 (C:UsersakikoDocumentsGameLib2010srcGameLibsModuleslibModules_d.lib) と一致しません。このため、プロジェクトが正常にビルドされない可能性があります。この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Lib.OutputFile) で指定されている値と一致することを確認してください。
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(Modules) が Library の OutputFile プロパティ値 (Modules_d) と一致しません。このため、プロジェクトが正常にビルドされない可能性があります。この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Lib.OutputFile) で指定されている値と一致することを確認してください。
    LINK : fatal error LNK1181: 入力ファイル ‘dxguid.lib’ を開けません。

    あと、出力メッセージの中に、
    c:program files (x86)microsoft sdkswindowsv7.0aincludedinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
    という文章が何度か出てきたのですが、エラーと関係あるのでしょうか?

    • slash より:

      そのメッセージを見るとDirectX SDKがインストールされていないようですね。
      Microsoftのページからとりあえず DirectX SDK 2010 June をダウンロードして、パソコンへインストールしてください。

      その後、同じようにビルドしてみてください(警告は出るかも知れないですが、ライブラリは生成されるかもです)。

  4. odio より:

    お世話になっております。VC++初心者なのですが、お教えください。
    1.のリビルドはうまくいったのですが、
    2.以降のビルドがエラーがでて失敗してしまいます。
    同じ手順でビルドしていいのでしょうか。
    下記のエラー等がでてしまいます。

    warning LNK4221: このオブジェクト ファイルは、以前に未定義であったパブリック シンボルを定義していないため、このライブラリを使用するリンク操作では使用されません。

  5. slash より:

    > odioさん

    詳しいことは省きますが、以下のメッセージが出ていても問題なく使用できます。
    ・warning LNK4221: このオブジェクト ファイルは、以前に未定義であったパブリック シンボルを定義していないため~
    ・warning LNK4006: __NULL_IMPORT_DESCRIPTOR は ****.lib で定義されています。~

    これらのメッセージはエラーと言うよりは警告(WARNING)ですね。

    これらの警告を除去するためには、収録されているソースコードをそれなりに変更しないといけないような気配を感じたため、放置していました。悩ませてしまったようで、すみません。

  6. fujianaka より:

    返事が遅くなってすみません。
    DirectX SDKをインストールしたらすべてリビルドできました。
    ありがとうございました。

  7. odio より:

    年始早々お返事ありがとうございます!
    延々MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(113,5): error MSB3073
    というのがでてたんですが原因がわかりまして無事リビルドできました!デバック開始がうまくいった時は正月早々お漏らししそうなくらいうれしかったです。ありがとうございました!

  8. warren より:

    お世話になっております。
    大変分かりやすい手順を教えていただきありがとうございます。
    ライブラリを利用する段階で躓いていたので大変助かります。
    しかし、手順どおりに作業をしても、どうしても下記の2種類のエラーが出てしまい困っております。

    お手間をおかけし申し訳ないのですが、ご解答いただければ幸いです。
    作業環境はWindows7HomePremium、VC2010expressです。

    —— すべてのリビルド開始: プロジェクト: Graphics, 構成: Release Win32 ——
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: コマンド “C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslVertexLightingVs.obj -o srcVertexLightingVsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslPixelLightingVs.obj -o srcPixelLightingVsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslPixelLightingPs.obj -o srcPixelLightingPsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073:
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: :VCEnd” はコード 9009 で終了しました。
    —— すべてのリビルド開始: プロジェクト: Graphics, 構成: Debug Win32 ——
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    ‘C:Users○○DocumentsVisual’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: コマンド “C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslNoLightingVs.obj -o srcNoLightingVsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslVertexLightingVs.obj -o srcVertexLightingVsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslPixelLightingVs.obj -o srcPixelLightingVsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: C:Users○○DocumentsVisual Studio 2010ProjectsGameLib2008srcGameLibsModules….ToolsbinConvertToCode.exe shaderhlslPixelLightingPs.obj -o srcPixelLightingPsGenerated.h
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073:
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0Microsoft.CppCommon.targets(103,5): error MSB3073: :VCEnd” はコード 9009 で終了しました。

    —— すべてのリビルド開始: プロジェクト: Input, 構成: Release Win32 ——
    StdAfx.cpp
    C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludedinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
    Joystick.cpp
    Keyboard.cpp
    Manager.cpp
    Mouse.cpp
    コードを生成中…
    LINK : fatal error LNK1181: 入力ファイル ‘dxguid.lib’ を開けません。
    —— すべてのリビルド開始: プロジェクト: Input, 構成: Debug Win32 ——
    StdAfx.cpp
    C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludedinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
    Mouse.cpp
    Manager.cpp
    Keyboard.cpp
    Joystick.cpp
    コードを生成中…
    LINK : fatal error LNK1181: 入力ファイル ‘dxguid.lib’ を開けません。

    • slash より:

      warrenさん

      まずは DirectX SDKをmicrosoftのページからダウンロードしてインストールしてください。

      ライブラリをビルドするためにProjects/GameLib2008以下で作業している思われるのですが、付属ディスクに入っていたzipファイルをここで展開したという認識であってますか?
      もし別の場所からコピーしたという状況であったなら、すべてのファイルをコピーしているか確認してみてください。
      ConvertToCode.exe が含まれていないため、いくつかのエラーが出ているような気もします。

      もしかしたら、DirectX SDKのコマンド実行の失敗により芋づる式にエラーとなっている可能性も高いです。
      今一度確認をよろしくお願いします。

  9. warren より:

    slashさん

    返信いただきありがとうございます!

    slashさんのご指摘いただいた2点を解決したところ、ビルドに成功しました!

    ①DirectX SDK
    ②ConvertToCode.exe

    ①は再インストール後パスを通したら解決しました。
    ②につきましては、パスに半角が混ざっているとだめなようでしたので、zipファイル(サポートページで公開されている2008版とslashさんのファイル)を解凍したものをC直下に置きました。

    以上の作業をした後、slashさんの手順を行うことで何とかGameLib_d.libを作成すること、サンプルをビルドすることが出来ました。
    ありがとうございます。

    …あとは自分で、ライブラリを利用するだけ…だったのですが、以下のような3つのエラーが出てとまっています。。。

    ひょっとして、ビルドに失敗しているのでしょうか?

    度々の質問で大変申し訳ないのですが、お手すきの際にご教授願えれば大変助かります。

    1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: “public: class std::basic_istream<char,struct std::char_traits > & __thiscall std::basic_istream<char,struct std::char_traits >::read(char *,__int64)” (?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z) は既に GameLib_d.lib(Manager.obj) で定義されています。

    1>GameLib_d.lib(WindowCreator.obj) : error LNK2001: 外部シンボル “__imp__MessageBoxA@16” は未解決です。

    1>GameLib_d.lib(WindowCreator.obj) : error LNK2019: 未解決の外部シンボル __imp__SetWindowPos@28 が関数 “public: void __thiscall GameLib::`anonymous namespace’::Impl::enableFullScreen(bool)” (?enableFullScreen@Impl@?A0xbc72e283@GameLib@@QAEX_N@Z) で参照されました。

    • slash より:

      このようなエラーになったプロジェクトは書籍にあったものですか?
      それとも新規に作り始めた自分のプロジェクトですか?

      ちなみに上記のメッセージ内容からすると GameLib_d.libは正常にできているのではないかと思います。

  10. warren より:

    返信ありがとうございます。

    サンプルプログラムはビルドできました。
    エラーが出たのは新規に作り始めた自分のプロジェクトです。
    空のプロジェクトに一から書いたプログラムで上記のエラーが出ました。
    サンプルをコピーペーストしても同様のエラーが出ました。

    GameLib_d.libはできているとの事ですので、ライブラリの読み込み等の設定周りがおかしいようですね。そのあたりを調べてみます。

    調べるべき場所が明確になりました。ありがとうございます。

    • slash より:

      C++の”コード生成”という設定の部分の食い違い、
      プロジェクトをWin32アプリケーションで作り始める、
      の2点が確認のポイントになるかと思います。

      • warren より:

        slashさん

        ついにライブラリを動かすことが出来ました!
        slashさんの丁寧な説明のおかげです!
        大変助かりました、ありがとうございます!

        VCとC++のライブラリの利用のどちらも慣れていなかったので、簡単な事を色々質問し、お手間を取らせてしまい申し訳ありませんでした。

        これで初期設定は整ったので、じっくり本を読み込んでいこうと思います。

        何度も詳しい説明をいただき、ありがとうございました。

  11. tes より:

    はじめまして、質問なのですが、modulesのリビルドがうまくいきません。出力エラーはこんな感じなのですが、
    srcCollisionMesh.cpp(329): error C2668: ‘abs’ : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
    10> C:Program FilesMicrosoft Visual Studio 10.0VCincludemath.h(499): ‘float abs(float)’ の可能性があります。
    10> C:UsersTesDesktopGameLib2008srcGameLibsModulesincludeGameLib/Math/Functions.h(21): または ‘float GameLib::Math::abs(float)’
    10> 引数リスト ‘(float)’ を一致させようとしているとき
    10>srcCollisionMesh.cpp(329): error C2668: ‘abs’ : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
    10> C:Program FilesMicrosoft Visual Studio 10.0VCincludemath.h(499): ‘float abs(float)’ の可能性があります。
    10> C:UsersTesDesktopGameLib2008srcGameLibsModulesincludeGameLib/Math/Functions.h(21): または ‘float GameLib::Math::abs(float)’

    どうしたらいいのでしょうか。
    作業環境はWindowsvista、VC2010expressです。
    よろしくおねがいします

    • slash より:

      たぶんやり方を間違えています。

      「CDROM内にある、VisualStudio2008用のソースコードを展開した後、
      srcフォルダでダウンロードしたファイルを上書きで展開してください。」

      今回の場合、おそらくですが CollisionMesh.cpp が更新されていません。
      ダウンロードしたzipファイルを展開して、ソースコード類を元々のファイルらに対して上書きでコピーしてください。

      • tes より:

        ありがとうございました!
        全てリビルド出来ました
        自分はsrcフォルダの上書きの意味が解ってなかったみたいです
        延々と元のsrcフォルダの上にcdrom内のsrcフォルダを展開してた
        どうもありがとうございました

  12. tengusa より:

    VC2010でやろうとして困っていた所だったので大変助かりました。有難うございます。

  13. matsujin より:

    【環境】
    VS2012Express for Window Desktop
    Windows7 Ultimate 64bit
    Phenom2 X3 720 BlackEdition
    でうまく動かなくて困っていましたが、こちらの内容がとても参考になり
    動くようになりました。
    ありがとうございます。

  14. onto より:

    初心者です。Modulesのリビルド、その他のGameLib.sinのリビルドも全て成功しましたが、上記のエラーメッセージが表示されました。GameLib_d.libとGameLib.libがVC2010でビルドされていないのが原因のようなのですが、「前のリビルドの部分」がどれにあたるかわからず、解決方法もわかりません。どうすれば解決できるでしょうか?

    よろしくお願いします。

    念のため、環境を書いておきます。

    VSのバージョン:VS2010Express for Window Desktop

    OS:Windows7  64bit Home Premium

    • slash より:

      「前に説明したリビルドの部分」とは、「VS2010用に準備する!」の段落のことを指しています。わかりづらくてすみません。
      GameLib_d,GameLibがリビルドされており、これを使用するプロジェクト側できちんと使用するGameLibを見つけられているか、確認したほうがいいかもしれません。

      解決しないようであれば1例として、一連の流れを具体的なプロジェクト名をあげて状況を説明してもらえませんか?

  15. onto より:

    大変申し訳ございません。「ゲームプログラマになる前に覚えておきたい技術」の公式サポートのサイトに置かれている「VC2010用」のファイルをダウンロードし、本のように設定すれば、エラーが出なくなりました。

    以前にも何度かこの↑方法を試したり、ここのサイトを参考にさせていただきました。しかし、今まで素直にサンプルが動いたことはなかったのですが、なぜか先日、何事もなかったかのようにビルドできました。

    理由は分かっていません。ですが、現状では特に不満もなく、本で学習を進めていくことができています。

    一応自己解決ということになりました。長い間、返信できず、その上、お手数をおかけして申し訳ございません。

    • slash より:

      > ontoさん
      無事に動くようになったとのことでよかったです。

      いまや公式の方にも 2010対応プロジェクトが上がっているようですし、私の用意したもので動かない場合はそれを使う、ということも検索してここにたどり着いた人にはオススメかもしれません。
      (逆も当然ありかと。公式版ですし)