Cross概要ゲームダウンロードお問い合わせホーム実験と実装と12.Dx11版のウインドウ作成と、共有ライブラリ2016/8/5実験と実装と12.Dx11版のウインドウ作成と、共有ライブラリTweetShare今回は、Dx11版のウインドウ作成します。その前に前項で開いたソリューションを閉じなければなりませんね。VS2015とか(VS2013でも)、ずっと継続してファイルの追加とか修正を行っていると、いろんな情報が積み重なってしまうんです。するとビルド時間が遅くなったり、なんか、「バージョンが違うファイルがある」なんてエラーが出たり、いろいろします。そんな時は思い切って、これまでVS2015が蓄積したデータを一気に削除してしまうとスッキリすることがあります。以下の図は、前項で開いた「SimplSampleTest」ディレクトリ内の「BaseCrossDx12.sln」を閉じたところです。いろんなディレクトリやファイルが作られているのがわかりますね。60メガもあるファイルもあります。「そんなの自分は作ったっけ?」て気にもなります。これまでの設定で「中間ファイル」というのは「Temp」ディレクトリに閉じ込めるよう指定しましたが、それでもこんなにファイルやディレクトリができてしまいます。これをこのまま持ち運びするとして、一つ上のディレクトリでzip圧縮したとしても、100メガ超えちゃうzipファイルになることがあります。「ああ、コンパイラって仕事してんだなあ」とつくづく思います。これでは持ち運びにも不便なので、定期的にいらないファイルは一気に削除してしまいましょう。このディレクトリで必要なのは「BaseCrossDx11ディレクトリ」「BaseCrossDx12ディレクトリ」前項で作成した「media」ディレクトリと「BaseCrossDx11.sln」「BaseCrossDx11.sln」の2ファイルです。他は全部削除してしまいましょう。VS2015は終了させてからこの処理を行ってくださいね。以下は、削除後のディレクトリです。このように、定期的に作業ファイルをクリアすると、コンパイラがストレスなく動くようになります。履歴とかも削除してしまうのでundoはきかなくなりますし、最初の「ビルド」は必ず「リビルド」になります。そのようにして今度は「BaseCrossDx11.sln」を開きます。前項にならってウインドウを作成するわけですが、記述するコードは、実は、Dx12版と同じです。前項を読み返しDx12となっているところはDx11としていただければウインドウは作成できると思います。「なら、前項の最後にでも解説してくれたらいいのに」と言われる方もいるかと思います。記事がGitHubのコミットに合わせて、ってことになっているので、記事をまたいでしまいました。今回の記事からは「共有ライブラリの作成」が主な話題です。この記事は、コミット「Dx12版のウインドウ作成」から、コミット「Dx11版ウインドウ作成と共有ファイルの追加」の間の作業です。GitHubサイトhttps://github.com/WiZFramework/BaseCrossを参照して下さい。前回の記事を読み返してみてあらためて思ったのですが、このブログはGitHubサイトと照らし合わせしないと、ホント何書いてあるかわかりませんね。「SourceTreeによるレポジトリのプル」は必須かと思います。上記サイトのレポジトリにSourceTreeでアクセスして、確認しながら記事を読んでください。その際、ローカルに自分用のブランチを作成するなどして、該当コミット時の状態で保存して確認するといいと思います。記事は2つのコミット間の話題ではありますが、当然後ろのほうのコミットに向かうので、コード解説は後ろのコミットに近いものになると思います。この記事時点で、GitHubサイトのコミットは、この記事で話題にしているコミットの5,6ステップ先に進んでおります。ここからのコミットはコミット間で結構大きな変更があります。細かくコミットするのもいいかもしれませんが、そうすると実装が中途半端な状態でコミットすることになるので、かえって混乱を招くかと思いそうしています。前置きしましたが、今回作成するのは「共有ファイル」です。いま開いているのは「BaseCrossDx11.sln」なのでそこから見える「DxLib共有アイテムプロジェクト」にファイルを追加していくことになります。「DxLib」の「フィルター」を作成します「Headers」というフィルターと「Sources」というフィルターです。ヘッダファイルとソースファイルをフィルターで分けています、収納するディレクトリは分けてはいません。VisualStdioのフィルターはファイル整理に大いに役立つので、皆さんも積極的に使ってみるといいでしょう。フィルタを作成したら早速共有ファイルを作成します。「Headers」フィルターを右ボタンクリクし、「追加」「新しい項目」で「ヘッダーファイル」「BaseHelper.h」を追加します。追加するディレクトリは「DxLib」のディレクトリ直下でかまいません。そこで、以下のように記述を開始します。basecrossこれは、これから記述するコードは、「basecross」という名前の「namespace」の属する、という指定です。BaseCrossフレームワークのライブラリはすべて「basecross」に属します。実は作成するゲームも「basecross」に属します。namespace」に属すると考えてください。現時点でも例外はあります。「WinMain,cpp」内の、WinMain関数やウインドウプロシージャです。namespace」に属しません。「DxLib」には何を記述するべきでしょうか。ここでじっくり考えてみましょう。「Dx11とDx12とで共通して使えて、さらに言えばより汎用的な関数やクラス」ですね。どんなものが考えられるでしょう。「例外処理」「CSV、バイナリファイルの読み込み」「XMLの読み書き」「数学計算クラス」そんな感じでしょうか。あと「衝突判定」を書けるかもしれません。実は「衝突判定」は共有エリアに記述することを少し迷いました。言いますのは、シェーダにCS(計算シェーダ)というのがあり、ひょっとするとこれでかけるかなと思ったのです(すべてではなく、本当に負荷がかかるところだけでも)。すると、シェーダはシェーダそのものは共通で使用できるのですが、扱いがDx11とDx12でまるで違います。「共有プロジェクト」ではなく「個別プロジェクト」に入れる必要があります。結果的にはそれは見送りました。大きいのは技術的な問題です。簡単な衝突判定も自分でCSで実装できてないという現実、それに加え、衝突判定で多用される「数学計算クラス」はこれ自体が内部で最適化(SSE2)処理されているので、ある程度(C++処理だけでガチガチ書くよりは)スピードはある、ということ。共有すべきもので、忘れてはならないのは「インターフェイス」でしょう。C++11になり、スマートポインタを大々的に活用してます。生ポインタを使用するところはほとんどありません。スマートポインタ(shared_ptr)は一つ欠点というか、使いにくいところがあって、というのは、thisポインタをスマート化(shared_ptrにするのが)結構厄介なのです。オブジェクトのshared_ptrを自分自身で作れると大変便利です。thisポインタのように使えますから。そのためには、オブジェクトをstd::enable_shared_from_this<型名>の派生クラスとして作成する必要があります。OnCreate()などの純粋仮想関数もあったほうがいいでしょう。そんなわけで「ObjectInterface」というインターフェイスを共有エリアに作成することにしました。そんなこんなあれこれ悩んで、結果的に、共有エリアには、以下の主なクラス、関数群をそれぞれのヘッダファイル、CPPファイルに収めています。(MS社サンプル流用)となっているのは、マイクロソフト社、DirectXのサンプル群の中から使用可能なものを流用しています。