「Robot Game」というゲームがソース無償公開!?
先日友人とチャットをしていたら、「OKIさん、こんなものが…」という感じでURLが貼ってあったので、サイトを見てみたところ、「Robot Game」というものが紹介されており、見た目は「アーマード・コア」(?)のような、TPS(Third Person Shooter)のロボットバトルゲームという感じでした。
「ほほぉ~」という感じで内容を読み進めていくと、「プロがXNAで作成した作品」ということと、「ソースが無償配布される」という事が書いてあり、「ええええぇ!?」と、かなり驚きました。
見た目は良質のロボットバトル、モーション、シェーディングも、パッと見は「かなりコンシューマーでリリースされている商品」っぽく、
「こ、こんなものがソース公開される!?」しかも「アマチュアプログラマにもプロのソースを読む機会を与える」ような内容が… ゴクリ。
と、ここまでは良かったのですが、更に公式サイトで内容を読んでみると、「It will be available for all XNA Creators Club Premium Members to download on Friday 6/27/2008 at 12pm PST.」という内容が…
「ガガーン! 俺は会員やないっ! orz」
とまぁ、このようなオチでした。(^^ゞ
◇ ◇ ◇
ここで思った事は、2つ。
1.「凄いっ! 会員になれば、プロのソースが読める
=世の中のゲームプログラマの技術の底あげが期待できるっ!
数冊でn万円もするような書籍よりも、てっとり早く理解ができる
(かもしれない)」
2.「こんなにも日本では広まっていないハードなのに、なぜ無償で提供しないのだろう…」
「1.」は当然の考えですが、「2.」に関しては、現状のXNAの状況や、現在のPSPの伸び率が背景にあって、そう思いました。
現在のXNAはシェーディング処理としてFXファイルが読めるので、エフェクトに関してはその気になれば、Direct3D(と過去の資産)と肩を並べられると感じますが、モーション(や衝突処理)のライブラリに関しては、全くといって良い程、整備されていない状況なので、ここで「一部のユーザーの特権」という事を行ってしまうと、「ハードが売れない(=ソフトも売り上げが伸びない)」…といった状況になるだけ…と思いました。
これで、もっと意欲的にお手本となるソースを配布するようにして「XBOX 360のハードを使って、同人ゲームが作れる」というような流れにすれば、今以上にハードの売り上げが伸び、多数のソフトメーカー参入が増加(これは同人サークルも含む)やエンジニアのスキルの底上げができ、マーケットとして広がるのではないかな? …と浅はかではありますが(←ここ重要です)、そう思ってしまいました。
少くとも私にとって、「このままだったら別にXNAを使用しなくてもWindows上オンリーでいいので、DirectXをラップしたフリーの高級ライブラリで、ゲーム作った方がいいだろう。」と感じてしまいます。(流石に私のポリシーとして、できるだけツクールに近いような制作はしたくないので、できるだけ言語ネイティブに近い自作になりますが…)
基本的にコンシューマーハードの発展というのは、ソフトのキラータイトルもさることながら、エンジニア(特にプログラマ)の開発しやすい環境が大前提という過去からの定石がある訳で(大抵大御所のローンチタイトルのリリースが遅れる理由はこの後者が成立していないからですしね)、ハードが売れないという死活問題になっている場合は、まずは「みんなが欲しがるハード」にしなければならない…と感じます。
SCEも認めたPSPが今非常に売れている理由に、「カスタムファームウェアの改造が(色々な意味で)大人気」という背景があるように、「とても欲しい(これは正当、不正は関係無しで)」と思わせる状況を作るのが重要なので、このようなライブラリが無償で公開されれば、一気に「このハードで色々と試してみたい、しかもWindowsのようなPCのハードウェア構成により挙動が変化することはない。」という魅惑的な知的好奇心が湧き出る人が今以上に増えそう… と思いました。
しかしかといって、お金を出している会員の方は当然優遇しなければなりません。そう考えると「会員限定」というのは至極当然な流れです。
…が、「閾を持つ着眼点がなんか違うなぁ~」と感じてなりません。上述に挙げるような、モーション、衝突判定等のようなライブラリに当るような部分は公開し、シェーディングのような職人が好んでチューニングするようなものを会員のみに公開する…というような事だったら納得していたかもしれません。
正直「現在のXNA」には失望してしまいます。(これは個人的には…です(^^ゞ 将来は考えが変る可能性は十分ありです)
しかし、「C#の独習」のため、なんだかんだいってこれで開発を続ける私であったwww
「ほほぉ~」という感じで内容を読み進めていくと、「プロがXNAで作成した作品」ということと、「ソースが無償配布される」という事が書いてあり、「ええええぇ!?」と、かなり驚きました。
見た目は良質のロボットバトル、モーション、シェーディングも、パッと見は「かなりコンシューマーでリリースされている商品」っぽく、
「こ、こんなものがソース公開される!?」しかも「アマチュアプログラマにもプロのソースを読む機会を与える」ような内容が… ゴクリ。
と、ここまでは良かったのですが、更に公式サイトで内容を読んでみると、「It will be available for all XNA Creators Club Premium Members to download on Friday 6/27/2008 at 12pm PST.」という内容が…
「ガガーン! 俺は会員やないっ! orz」
とまぁ、このようなオチでした。(^^ゞ
◇ ◇ ◇
ここで思った事は、2つ。
1.「凄いっ! 会員になれば、プロのソースが読める
=世の中のゲームプログラマの技術の底あげが期待できるっ!
数冊でn万円もするような書籍よりも、てっとり早く理解ができる
(かもしれない)」
2.「こんなにも日本では広まっていないハードなのに、なぜ無償で提供しないのだろう…」
「1.」は当然の考えですが、「2.」に関しては、現状のXNAの状況や、現在のPSPの伸び率が背景にあって、そう思いました。
現在のXNAはシェーディング処理としてFXファイルが読めるので、エフェクトに関してはその気になれば、Direct3D(と過去の資産)と肩を並べられると感じますが、モーション(や衝突処理)のライブラリに関しては、全くといって良い程、整備されていない状況なので、ここで「一部のユーザーの特権」という事を行ってしまうと、「ハードが売れない(=ソフトも売り上げが伸びない)」…といった状況になるだけ…と思いました。
これで、もっと意欲的にお手本となるソースを配布するようにして「XBOX 360のハードを使って、同人ゲームが作れる」というような流れにすれば、今以上にハードの売り上げが伸び、多数のソフトメーカー参入が増加(これは同人サークルも含む)やエンジニアのスキルの底上げができ、マーケットとして広がるのではないかな? …と浅はかではありますが(←ここ重要です)、そう思ってしまいました。
少くとも私にとって、「このままだったら別にXNAを使用しなくてもWindows上オンリーでいいので、DirectXをラップしたフリーの高級ライブラリで、ゲーム作った方がいいだろう。」と感じてしまいます。(流石に私のポリシーとして、できるだけツクールに近いような制作はしたくないので、できるだけ言語ネイティブに近い自作になりますが…)
基本的にコンシューマーハードの発展というのは、ソフトのキラータイトルもさることながら、エンジニア(特にプログラマ)の開発しやすい環境が大前提という過去からの定石がある訳で(大抵大御所のローンチタイトルのリリースが遅れる理由はこの後者が成立していないからですしね)、ハードが売れないという死活問題になっている場合は、まずは「みんなが欲しがるハード」にしなければならない…と感じます。
SCEも認めたPSPが今非常に売れている理由に、「カスタムファームウェアの改造が(色々な意味で)大人気」という背景があるように、「とても欲しい(これは正当、不正は関係無しで)」と思わせる状況を作るのが重要なので、このようなライブラリが無償で公開されれば、一気に「このハードで色々と試してみたい、しかもWindowsのようなPCのハードウェア構成により挙動が変化することはない。」という魅惑的な知的好奇心が湧き出る人が今以上に増えそう… と思いました。
しかしかといって、お金を出している会員の方は当然優遇しなければなりません。そう考えると「会員限定」というのは至極当然な流れです。
…が、「閾を持つ着眼点がなんか違うなぁ~」と感じてなりません。上述に挙げるような、モーション、衝突判定等のようなライブラリに当るような部分は公開し、シェーディングのような職人が好んでチューニングするようなものを会員のみに公開する…というような事だったら納得していたかもしれません。
正直「現在のXNA」には失望してしまいます。(これは個人的には…です(^^ゞ 将来は考えが変る可能性は十分ありです)
しかし、「C#の独習」のため、なんだかんだいってこれで開発を続ける私であったwww
XNAのソース上からXACTのエンジンを操作する
前回の設計にてXACTのプロジェクト作成して、これをXNAのプロジェクトに登録しました。
今回は「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークに合せて組み込んでみたいと思います。
まずはいつものようにサンプルソースを作成してみたので、これを元にXNA上での実現方式について説明して行きたいと思います。
お決まりの謳い文句ですが『この実行は自己責任』にてお願いいたします。m(_ _)m
実行すると今迄説明した自機が画面に表示されるので、これをコントローラーの左スティック、もしくはキーボードの左右にて移動することができます。
また、コントローラーのXボタン、もしくはキーボードのZキーを押下すると自機から弾が発射されます。ボタンを押しっぱなしにすると等間隔で連続して弾が発射されます。
■サンプルソース (2008.06.15.zip)
【実行画面】
【データ構成図】
Javaの説明の時同様、今回も設計図が大きくなりすぎたので、PDFでの掲載にしました。Adobe Readerがインストールされているコンピュータにて観覧できます。もしもAdobe Readerがインストールされていない場合は、多少縮小したイメージとして、こちらを用意しました。【縮小版設計図】
【音情報クラス(SoundItem)】
XNAにて設計を行うと、サウンド周りが非常にシンプルに設計できます(なんと言ってもWAVのみサポートですし)。
このため、今回のサンプルでは、共通フレームワークで設計した「プリミティブな音情報」のクラスを殆どそのまま移植します。
しかしながら、XACT上で再生する時に、設計によりキュー(Cue)クラス情報が必要になるので、これをメンバに指定しておきます。
また、XACTを用いる場合には色々なエフェクトが実現できるので、もしもこのサンプルを改良する場合は、SoundItemクラスから音響効果を持つデータのクラスを派生させた音項目クラスを作ると良いかと思います。
【音管理クラス(SoundManager)】
こちらも音情報クラス同様です。しかし、音声デバイス(エンジン)がXNA(XACT)になるので、ここが違います。
XNAのサウンドエンジンは、AudioEngineクラスと、WaveBankクラス、SoundBankクラスを用いて実現されており、AudioEngineクラスが中核、WaveBank、SoundBankがそれぞれ、XACTプロジェクトを作成した時に作成したWaveBankとSoundBankに対応しています。
WaveBankクラスとSoundBankクラスはAudioEngineクラスにアタッチされる形を取り、本サンプルプログラムでは、SoundManager.Initializeメソッドにてこれを実装しています。
【音管理クラスにXACTをラップする】
SoundManagerクラスにXACTのエンジンをラップしています。イメージはデータ構成図のように、XNAのAudioEngineクラスが中核、WaveBank、SoundBankがそれぞれ、XACTプロジェクトを作成した時に作成したWaveBankとSoundBankに対応しています。
WaveBankクラスとSoundBankクラスはAudioEngineクラスにアタッチされる形を取り、本サンプルプログラムでは、SoundManager.Initializeメソッドにてこれを実装しています。
プログラムコードとして音声の再生/停止をリクエストする場合は、SoundBankクラスがインターフェースとなり、このクラスよりCueクラスを取得し、このクラスのメソッドPlay/Stopにて再生/停止を実現します。
再生/停止に関してはCueクラスを取得しなくてもSoundBankクラスにて実現が行えますが、以下に説明するループ処理等が対応できないので、本サンプルプログラムでは、このCueクラス情報をSoundItemに格納して、ループを行うタイミングでこれを用いるようにしています。
【音声ループ処理】
音声ループ処理はXACTプロジェクトにて設定する方法と、自前でループ処理を実装する方法があります。
XACTにて設定する場合は、SoundBankの「Play Wave Properties」の「Loop Event」にて無限ループ再生が行えます。
しかし本サンプルプログラムは、プログラムで色々と制御してみたいと思うので、自前でループ処理を実装してみました。
自前でループする処理は、SoundManagerクラスのExecuteメソッド内にて、XNAのサウンドエンジンの更新を行った後に登録されている音情報を走査して、ループ処理をする必要があるものに対して、再度再生を実行する形と取っています。
SoundManager.Executeメソッドは、XNAのUpdateメソッドの実行時にGlobalクラスのExecuteメソッドが実行され、その際に呼び出されます。
このループ再生の際に上述で説明したCueクラスを用いて再度再生を行う形となります。
このCueクラスはSoundBankクラス内では一度の再生内のみが有効となっているため、再度再生を行う際には、新たに情報を取得しなおして、音情報クラスに再度登録しなおしています。
◇ ◇ ◇
これでJavaの時同様に、サンプルフレームワークをXNAにて実現することができました。
非常に強力なサウンドライブラリの恩恵で、「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークの仕様を殆ど変更しないで実装できてしまうのは素晴らしいと思います。
ということで、まずはフレームワークの設計はひとまずここまでとして、今後このフレームワークを用いて何か開発してみたくなったら、肉付けやブラッシュアップを繰り返して、「何かXNAってみる」ことになると思います。
(しかし、日本でのここ最近における本ライブラリの閑古鳥状態を見ると、それも無いかもなぁ…と少し思ったりはしていますが…)
◇ ◇ ◇
先日のブログ記事のためにVC++でサンプルプログラムを作ってみた時の感触から開発環境の比較を「C#/XNA」と「C++/DirectX」で行うと、私個人がサンデープログラムを行う場合としては、XNAの方が分が悪く感じてしまった…という印象です。
Xbox 360のハードウェアが日本ではなかなか広まらないという事と、開発するためのライブラリが充実していないというのが、根底にあるからでしょうか…
しかしながら、ゲーム開発における最初のとっかかりや、IDEと高級言語とのコラボによる開発環境は、使ってみた感触としては「C#/XNA」の方が素晴しいと感じています。流石ゲーム開発のために作られた開発環境だけあります。
ビジネスアプリケーション開発をメインの職としている私としては、XNAがGUI(のウィンドウ)部分とリンクできるという事で、CAD系の開発や、プレゼンテーションソフトを短期開発するというような案件がある場合には、一つの手段として選択できる可能性を秘めている事は把握できました。
(簡易的な3D表現を行うソフトには非常に便利かと思います。かといって本格的なソフトをリリースする際には、XNAはゲームのようなエンターテーメント系の客先位しかリリース先は無いとも思っています)
今回は「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークに合せて組み込んでみたいと思います。
まずはいつものようにサンプルソースを作成してみたので、これを元にXNA上での実現方式について説明して行きたいと思います。
お決まりの謳い文句ですが『この実行は自己責任』にてお願いいたします。m(_ _)m
実行すると今迄説明した自機が画面に表示されるので、これをコントローラーの左スティック、もしくはキーボードの左右にて移動することができます。
また、コントローラーのXボタン、もしくはキーボードのZキーを押下すると自機から弾が発射されます。ボタンを押しっぱなしにすると等間隔で連続して弾が発射されます。
■サンプルソース (2008.06.15.zip)
【実行画面】
【データ構成図】
Javaの説明の時同様、今回も設計図が大きくなりすぎたので、PDFでの掲載にしました。Adobe Readerがインストールされているコンピュータにて観覧できます。もしもAdobe Readerがインストールされていない場合は、多少縮小したイメージとして、こちらを用意しました。【縮小版設計図】
【音情報クラス(SoundItem)】
XNAにて設計を行うと、サウンド周りが非常にシンプルに設計できます(なんと言ってもWAVのみサポートですし)。
このため、今回のサンプルでは、共通フレームワークで設計した「プリミティブな音情報」のクラスを殆どそのまま移植します。
しかしながら、XACT上で再生する時に、設計によりキュー(Cue)クラス情報が必要になるので、これをメンバに指定しておきます。
また、XACTを用いる場合には色々なエフェクトが実現できるので、もしもこのサンプルを改良する場合は、SoundItemクラスから音響効果を持つデータのクラスを派生させた音項目クラスを作ると良いかと思います。
【音管理クラス(SoundManager)】
こちらも音情報クラス同様です。しかし、音声デバイス(エンジン)がXNA(XACT)になるので、ここが違います。
XNAのサウンドエンジンは、AudioEngineクラスと、WaveBankクラス、SoundBankクラスを用いて実現されており、AudioEngineクラスが中核、WaveBank、SoundBankがそれぞれ、XACTプロジェクトを作成した時に作成したWaveBankとSoundBankに対応しています。
WaveBankクラスとSoundBankクラスはAudioEngineクラスにアタッチされる形を取り、本サンプルプログラムでは、SoundManager.Initializeメソッドにてこれを実装しています。
【音管理クラスにXACTをラップする】
SoundManagerクラスにXACTのエンジンをラップしています。イメージはデータ構成図のように、XNAのAudioEngineクラスが中核、WaveBank、SoundBankがそれぞれ、XACTプロジェクトを作成した時に作成したWaveBankとSoundBankに対応しています。
WaveBankクラスとSoundBankクラスはAudioEngineクラスにアタッチされる形を取り、本サンプルプログラムでは、SoundManager.Initializeメソッドにてこれを実装しています。
プログラムコードとして音声の再生/停止をリクエストする場合は、SoundBankクラスがインターフェースとなり、このクラスよりCueクラスを取得し、このクラスのメソッドPlay/Stopにて再生/停止を実現します。
再生/停止に関してはCueクラスを取得しなくてもSoundBankクラスにて実現が行えますが、以下に説明するループ処理等が対応できないので、本サンプルプログラムでは、このCueクラス情報をSoundItemに格納して、ループを行うタイミングでこれを用いるようにしています。
【音声ループ処理】
音声ループ処理はXACTプロジェクトにて設定する方法と、自前でループ処理を実装する方法があります。
XACTにて設定する場合は、SoundBankの「Play Wave Properties」の「Loop Event」にて無限ループ再生が行えます。
しかし本サンプルプログラムは、プログラムで色々と制御してみたいと思うので、自前でループ処理を実装してみました。
自前でループする処理は、SoundManagerクラスのExecuteメソッド内にて、XNAのサウンドエンジンの更新を行った後に登録されている音情報を走査して、ループ処理をする必要があるものに対して、再度再生を実行する形と取っています。
SoundManager.Executeメソッドは、XNAのUpdateメソッドの実行時にGlobalクラスのExecuteメソッドが実行され、その際に呼び出されます。
このループ再生の際に上述で説明したCueクラスを用いて再度再生を行う形となります。
このCueクラスはSoundBankクラス内では一度の再生内のみが有効となっているため、再度再生を行う際には、新たに情報を取得しなおして、音情報クラスに再度登録しなおしています。
◇ ◇ ◇
これでJavaの時同様に、サンプルフレームワークをXNAにて実現することができました。
非常に強力なサウンドライブラリの恩恵で、「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークの仕様を殆ど変更しないで実装できてしまうのは素晴らしいと思います。
ということで、まずはフレームワークの設計はひとまずここまでとして、今後このフレームワークを用いて何か開発してみたくなったら、肉付けやブラッシュアップを繰り返して、「何かXNAってみる」ことになると思います。
(しかし、日本でのここ最近における本ライブラリの閑古鳥状態を見ると、それも無いかもなぁ…と少し思ったりはしていますが…)
◇ ◇ ◇
先日のブログ記事のためにVC++でサンプルプログラムを作ってみた時の感触から開発環境の比較を「C#/XNA」と「C++/DirectX」で行うと、私個人がサンデープログラムを行う場合としては、XNAの方が分が悪く感じてしまった…という印象です。
Xbox 360のハードウェアが日本ではなかなか広まらないという事と、開発するためのライブラリが充実していないというのが、根底にあるからでしょうか…
しかしながら、ゲーム開発における最初のとっかかりや、IDEと高級言語とのコラボによる開発環境は、使ってみた感触としては「C#/XNA」の方が素晴しいと感じています。流石ゲーム開発のために作られた開発環境だけあります。
ビジネスアプリケーション開発をメインの職としている私としては、XNAがGUI(のウィンドウ)部分とリンクできるという事で、CAD系の開発や、プレゼンテーションソフトを短期開発するというような案件がある場合には、一つの手段として選択できる可能性を秘めている事は把握できました。
(簡易的な3D表現を行うソフトには非常に便利かと思います。かといって本格的なソフトをリリースする際には、XNAはゲームのようなエンターテーメント系の客先位しかリリース先は無いとも思っています)
XACTプロジェクトを作る
今回はXNA(の「XNA Game Studio Express」)をインストールすると同時にインストールされる、
「Microsoft Cross-Platform Audio Creation Tool (XACT)」
を用いて「XACTのプロジェクト」を作成して、これを「XNAのプロジェクトに登録」してみようと思います。
【ファイルを用意する】
発声させるサウンドファイルを用意します。
今後は2008/4/15に説明したサンプルに加えようと思うので、このプロジェクトの以下のフォルダの下に置くことにします。
[サウンドファイルを置く場所]
SampleGame\SampleGame\Sound
サウンドファイルは、2008/5/17にJavaでサンプルを作成した自機のショット音とBGMとします。
BGMのファイルはMIDI(.midi)のファイルだったので、WAVE(.wav)に変換しておきます。
(変換するツールはフリーウェアで星の数ほどあると思うので、適当に変換しましょう)
[サウンドファイル]
自機のショット音:ShipMissile.wav
BGM:BGM1.wav
【起動】
XACTプロジェクトを作るツールの起動です。
スタートメニューより、→「プログラム」→「Microsoft XNA Game Studio Express」→「Tools」→
「Microsoft Cross-Platform Audio Creation Tool (XACT)」にて起動します。
(名称が長いので以降「XACT」と呼びます)
XACTを起動すると、以下のような画面が表示されます。
【Wave Bankへサウンドファイルを登録】
まずはサウンドファイルを登録する、「Wave Bank」というものを作成します。
XACTのメニューから「Wave Banks」→「New Wave Bank」を実行します。
もしくは、上部のボタンからも実行できます。
画面右側にWave Bankのウィンドウが作成されました。
次にこのウィンドウにサウンドファイルを登録します。XACTのメニューから
「Wave Banks」→「Insert Wave Files」を実行します。
もしくはWave Bankのウィンドウから右クリックメニューからも実行できます。
ファイル名を指定するダイアログが表示されるので、ここで「ShipMissile.wav」を登録します。
続いて「BGM1.wav」も登録します。
登録されました。
【プロジェクトの保存】
サウンドファイルの登録を行ったので、ここで一度プロジェクトを保存します。
今回保存する場所はサウンドファイルを置いた場所に「XACT」というフォルダを作成して、その下にしておくことにします。
[プロジェクトのファイルを置く場所]
SampleGame\SampleGame\Sound\XACT
[プロジェクトのファイル名]
SampleGame.xap
保存はXACTのメニューの「File」→「Save Project」を実行して、上述の場所に保存します。
これで「SampleGame\SampleGame\Sound\XACT\SampleGame.xap」にプロジェクトが置かれることになりました。
【プロジェクト内のサウンドファイルのパス変更】
この時点では、登録されたファイルが絶対パスになっているので、これをサンプルソースの階層に合うように設定します。
とりあえず今後、何かXACTで作成したもの(プロジェクトファイル含む)は、ここに置こうかと思います。
[サウンドファイルを置く場所とプロジェクト名]
SampleGame\SampleGame\Sound\XACT\SampleGame.xap
Wave Bankに登録されたサウンドファイルはプロジェクトのフォルダを起点とするようなので、この設計からサウンドファイルとプロジェクトはこのような感じとなります。
SampleGame\SampleGame\Sound\XACT\SampleGame.xap
SampleGame\SampleGame\Sound\ShipMissile.wav
SampleGame\SampleGame\Sound\BGM1.wav
これらを踏まえて、登録した自機のショット音とBGMのパスは以下のように設定します。
..\ShipMissile.wav
..\BGM1.wav
プロジェクトファイルの一つ上の階層にサウンドファイルが置いてあるという設定です。
(サウンドファイル自体はXACT自体は関係ないリソースという考えです。今後XACTを使用しなくても、このリソースはそのまま使うという考えです)
相対パスの方がプロジェクトの環境に依存し辛くなるかと思います。
設定はWave Bankのウィンドウ内のサウンドファイルを選択し、画面左下のプロパティペインの
「Wave Properties」内の「SourcePath」情報を変更します。
少し設定し辛いとは思いますが、各々直に入力して下さい。
【Sound Bankへサウンドを登録】
次にWave Bankとの関係を持たせて、プログラムから参照する情報となる、Sound Bankというものの作成です。
XACTのメニューから「Sound Banks」→「New Sound Bank」を実行します。
もしくは、上部のボタンからも実行できます。手順はWave Bankと同じですね。
画面右側にSound Bankのウィンドウが作成されました。Wave Bankのウィンドウとオーバーラップするので、並べて置きましょう。
次にこのウィンドウにWave Bankで登録したサウンドファイルの項目を登録します。Wave Bankで登録した項目を選択して、Sound Bankにドラッグ&ドロップします。
この際、上下に表示されているウィンドウの2つにドラッグ&ドロップします。
これにより、プログラムからアクセスできる、情報が登録されました。今回のようにドラッグ&ドロップした場合は、リストの項目にある「Sound Name」「Cue Name」は、Wave Bankと同じ名前になります。もしもプログラムからこの名前ではない別の名前でアクセスしたい場合は、「Cue Name」のウィンドウの方の項目を選択して左下のプロパティペインの
「Cue Properties」内の「Name」の項目を変更してください。
ここでプロジェクトを保存します。
XACTのメニューの「File」→「Save Project」を実行して、プロジェクトファイルを更新します。
【XNAプロジェクトへの登録】
いよいよXACTで作成したプロジェクトをXNAのプロジェクトに登録します。
登録はとても簡単で、以下の場所にXACTのプロジェクトを登録するだけです。
今回のサンプルでは、「SampleGame\SampleGame\Sound\XACT」の下に登録します。
(手動でフォルダの作成を行うと、たまにソリューションエクスプローラがエラーを発生する場合があるので、その場合はエクスプローラー(こっちはWindowsのエクスプローラ)からSoundフォルダごとドラッグ&ドロップを行う等してください。この際、登録に不要なファイル(.wav等)が追加されるので、そのままにしておくか、元のファイルのバックアップを保存しておき、プロジェクトから削除を行ってください。削除を行うとファイルまで消去されるので注意が必要です)
これでXACTのプロジェクトの作成、並びにXNAのプロジェクト登録が完了しました。
ここでXNAのプロジェクトをビルドするとXACTのプロジェクトのビルドが自動的に行われ、実行環境下に実行に必要なXACTのファイルや変換された音声ファイルが出力されます。
今回のサンプルで、デバッグモードにてビルドすると、
「SampleGame\SampleGame\bin\x86\Debug\Sound\XACT」の下に
SampleGame.xgs(オーディオエンジンに渡すXACT設定情報)
Wave Bank.xwb(Wave Bank情報)
Sound Bank.xsb(Sound Bank情報)
が生成されます。
ということで、これのサンプルソースを掲載したいと思います。
■サンプルソース (2008.06.04)
◇ ◇ ◇
プログラミングという観点から見ると、かなり「○○○ツクール」のような作業のようですが、このような作業でXACTの高度な機能が使えるのであれば非常に素晴らしいことです。
次回はこのサンプルソースより、「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークに合せて組み込んでみたいと思います。
「Microsoft Cross-Platform Audio Creation Tool (XACT)」
を用いて「XACTのプロジェクト」を作成して、これを「XNAのプロジェクトに登録」してみようと思います。
【ファイルを用意する】
発声させるサウンドファイルを用意します。
今後は2008/4/15に説明したサンプルに加えようと思うので、このプロジェクトの以下のフォルダの下に置くことにします。
[サウンドファイルを置く場所]
SampleGame\SampleGame\Sound
サウンドファイルは、2008/5/17にJavaでサンプルを作成した自機のショット音とBGMとします。
BGMのファイルはMIDI(.midi)のファイルだったので、WAVE(.wav)に変換しておきます。
(変換するツールはフリーウェアで星の数ほどあると思うので、適当に変換しましょう)
[サウンドファイル]
自機のショット音:ShipMissile.wav
BGM:BGM1.wav
【起動】
XACTプロジェクトを作るツールの起動です。
スタートメニューより、→「プログラム」→「Microsoft XNA Game Studio Express」→「Tools」→
「Microsoft Cross-Platform Audio Creation Tool (XACT)」にて起動します。
(名称が長いので以降「XACT」と呼びます)
XACTを起動すると、以下のような画面が表示されます。
【Wave Bankへサウンドファイルを登録】
まずはサウンドファイルを登録する、「Wave Bank」というものを作成します。
XACTのメニューから「Wave Banks」→「New Wave Bank」を実行します。
もしくは、上部のボタンからも実行できます。
画面右側にWave Bankのウィンドウが作成されました。
次にこのウィンドウにサウンドファイルを登録します。XACTのメニューから
「Wave Banks」→「Insert Wave Files」を実行します。
もしくはWave Bankのウィンドウから右クリックメニューからも実行できます。
ファイル名を指定するダイアログが表示されるので、ここで「ShipMissile.wav」を登録します。
続いて「BGM1.wav」も登録します。
登録されました。
【プロジェクトの保存】
サウンドファイルの登録を行ったので、ここで一度プロジェクトを保存します。
今回保存する場所はサウンドファイルを置いた場所に「XACT」というフォルダを作成して、その下にしておくことにします。
[プロジェクトのファイルを置く場所]
SampleGame\SampleGame\Sound\XACT
[プロジェクトのファイル名]
SampleGame.xap
保存はXACTのメニューの「File」→「Save Project」を実行して、上述の場所に保存します。
これで「SampleGame\SampleGame\Sound\XACT\SampleGame.xap」にプロジェクトが置かれることになりました。
【プロジェクト内のサウンドファイルのパス変更】
この時点では、登録されたファイルが絶対パスになっているので、これをサンプルソースの階層に合うように設定します。
とりあえず今後、何かXACTで作成したもの(プロジェクトファイル含む)は、ここに置こうかと思います。
[サウンドファイルを置く場所とプロジェクト名]
SampleGame\SampleGame\Sound\XACT\SampleGame.xap
Wave Bankに登録されたサウンドファイルはプロジェクトのフォルダを起点とするようなので、この設計からサウンドファイルとプロジェクトはこのような感じとなります。
SampleGame\SampleGame\Sound\XACT\SampleGame.xap
SampleGame\SampleGame\Sound\ShipMissile.wav
SampleGame\SampleGame\Sound\BGM1.wav
これらを踏まえて、登録した自機のショット音とBGMのパスは以下のように設定します。
..\ShipMissile.wav
..\BGM1.wav
プロジェクトファイルの一つ上の階層にサウンドファイルが置いてあるという設定です。
(サウンドファイル自体はXACT自体は関係ないリソースという考えです。今後XACTを使用しなくても、このリソースはそのまま使うという考えです)
相対パスの方がプロジェクトの環境に依存し辛くなるかと思います。
設定はWave Bankのウィンドウ内のサウンドファイルを選択し、画面左下のプロパティペインの
「Wave Properties」内の「SourcePath」情報を変更します。
少し設定し辛いとは思いますが、各々直に入力して下さい。
【Sound Bankへサウンドを登録】
次にWave Bankとの関係を持たせて、プログラムから参照する情報となる、Sound Bankというものの作成です。
XACTのメニューから「Sound Banks」→「New Sound Bank」を実行します。
もしくは、上部のボタンからも実行できます。手順はWave Bankと同じですね。
画面右側にSound Bankのウィンドウが作成されました。Wave Bankのウィンドウとオーバーラップするので、並べて置きましょう。
次にこのウィンドウにWave Bankで登録したサウンドファイルの項目を登録します。Wave Bankで登録した項目を選択して、Sound Bankにドラッグ&ドロップします。
この際、上下に表示されているウィンドウの2つにドラッグ&ドロップします。
これにより、プログラムからアクセスできる、情報が登録されました。今回のようにドラッグ&ドロップした場合は、リストの項目にある「Sound Name」「Cue Name」は、Wave Bankと同じ名前になります。もしもプログラムからこの名前ではない別の名前でアクセスしたい場合は、「Cue Name」のウィンドウの方の項目を選択して左下のプロパティペインの
「Cue Properties」内の「Name」の項目を変更してください。
ここでプロジェクトを保存します。
XACTのメニューの「File」→「Save Project」を実行して、プロジェクトファイルを更新します。
【XNAプロジェクトへの登録】
いよいよXACTで作成したプロジェクトをXNAのプロジェクトに登録します。
登録はとても簡単で、以下の場所にXACTのプロジェクトを登録するだけです。
今回のサンプルでは、「SampleGame\SampleGame\Sound\XACT」の下に登録します。
(手動でフォルダの作成を行うと、たまにソリューションエクスプローラがエラーを発生する場合があるので、その場合はエクスプローラー(こっちはWindowsのエクスプローラ)からSoundフォルダごとドラッグ&ドロップを行う等してください。この際、登録に不要なファイル(.wav等)が追加されるので、そのままにしておくか、元のファイルのバックアップを保存しておき、プロジェクトから削除を行ってください。削除を行うとファイルまで消去されるので注意が必要です)
これでXACTのプロジェクトの作成、並びにXNAのプロジェクト登録が完了しました。
ここでXNAのプロジェクトをビルドするとXACTのプロジェクトのビルドが自動的に行われ、実行環境下に実行に必要なXACTのファイルや変換された音声ファイルが出力されます。
今回のサンプルで、デバッグモードにてビルドすると、
「SampleGame\SampleGame\bin\x86\Debug\Sound\XACT」の下に
SampleGame.xgs(オーディオエンジンに渡すXACT設定情報)
Wave Bank.xwb(Wave Bank情報)
Sound Bank.xsb(Sound Bank情報)
が生成されます。
ということで、これのサンプルソースを掲載したいと思います。
■サンプルソース (2008.06.04)
◇ ◇ ◇
プログラミングという観点から見ると、かなり「○○○ツクール」のような作業のようですが、このような作業でXACTの高度な機能が使えるのであれば非常に素晴らしいことです。
次回はこのサンプルソースより、「ゲームプログラミング [共通]」カテゴリで設計したサウンドのフレームワークに合せて組み込んでみたいと思います。
XNAにおけるサウンドの設計 (XNAのサポートしているオーディオエンジンとデータファイルについて)
XNAにおけるサウンドの設計は、Javaにてサウンドの実装を設計した時同様な流れで設計をしていきます。
ということで、まず検討することはXNAがサポートしている音声のデータファイルから始めていきたいと思います。
XNAはDirectXではお馴染(?)のXACTというオーディオエンジンを用いて実現します。
このエンジンがサポートする音声データファイルフォーマットはJava同様の「WAVE」「AIFF」のフォーマットと、「XMA」というフォーマットをサポートしています。
XMAフォーマットは、オーディオプレイヤーでは有名なフォーマットである、WMA(Windows Media Audio)のフォーマットを「ゲーム向けにカスタマイズしたもの」とのことで(私もこのフォーマットを知らなかったので、ネット検索で知りました)、高圧縮で且つリアルタイムにデコードするのに向いているとのことです。(Xbox 360にはこのフォーマットをハードウェアデコードする機能が乗っているとのことです)
しかし、このファイルフォーマットの変換方法は…私は知りません。(^^ゞ
また、このフォーマットはDirectX SDK 2008のドキュメントによると、色々と制限がある模様です。
XACTは上述のように「波形データ系」の音声フォーマットのみをサポートしており、JavaのようにMIDI等の「コマンドデータ系」の音声ファイルをサポートていません。
これは「ゲームにおいて実行する環境毎にゲームの音質が変るというのは望ましくない」というような理由があるのかは不明ですが、「波形データ系」の音声のみで設計をすることになります。
波形データ系のみで設計する場合、「Javaにおけるサウンドの設計」にて検討したとおり、BGM等の再生時間の長い楽曲の場合はとてもデータ量が多いため、プログラムが処理を行う際に(メモリの載せて)再生するデータを調整しなければならないのですが、そこは素晴らしい事にXACTがメモリに全て載せて再生するか、ストリームとして分割してメモリに載せて再生するかを指定できます。
しかも波形データなのでエフェクトがかけやすい事もあり、エコーや、データ毎のボリューム変更、ミキシング等一般的なオーディオ機器のDSPのような機能を持っています。
ただし、再生速度の変更が容易に設定できないという話を過去に聴いたことがあり、よくある「時間制限のあるゲームで、時間がなくなってくるとBGMの再生速度が上る…」といった処理の実現が大変という事を聴いたことがあります。この場合は、速度の速い曲をクロスフェードで切り替える方法を取ると良いとか…
(結局のところ、私はこの機能を使用したことがない&実装したことがないので、真偽は不明です(^^ゞ)
このようなことから、Javaの時同様に表を作成すると、
のような感じでしょうか。
次回は具体的にXNAに付属している「Microsoft Cross-Platform Audio Creation Tool (XACT)」というツールを用いて、XACT用のプロジェクトの作成、XNAのプロジェクトへの登録を行ってみたいと思います。
ということで、まず検討することはXNAがサポートしている音声のデータファイルから始めていきたいと思います。
XNAはDirectXではお馴染(?)のXACTというオーディオエンジンを用いて実現します。
このエンジンがサポートする音声データファイルフォーマットはJava同様の「WAVE」「AIFF」のフォーマットと、「XMA」というフォーマットをサポートしています。
XMAフォーマットは、オーディオプレイヤーでは有名なフォーマットである、WMA(Windows Media Audio)のフォーマットを「ゲーム向けにカスタマイズしたもの」とのことで(私もこのフォーマットを知らなかったので、ネット検索で知りました)、高圧縮で且つリアルタイムにデコードするのに向いているとのことです。(Xbox 360にはこのフォーマットをハードウェアデコードする機能が乗っているとのことです)
しかし、このファイルフォーマットの変換方法は…私は知りません。(^^ゞ
また、このフォーマットはDirectX SDK 2008のドキュメントによると、色々と制限がある模様です。
XACTは上述のように「波形データ系」の音声フォーマットのみをサポートしており、JavaのようにMIDI等の「コマンドデータ系」の音声ファイルをサポートていません。
これは「ゲームにおいて実行する環境毎にゲームの音質が変るというのは望ましくない」というような理由があるのかは不明ですが、「波形データ系」の音声のみで設計をすることになります。
波形データ系のみで設計する場合、「Javaにおけるサウンドの設計」にて検討したとおり、BGM等の再生時間の長い楽曲の場合はとてもデータ量が多いため、プログラムが処理を行う際に(メモリの載せて)再生するデータを調整しなければならないのですが、そこは素晴らしい事にXACTがメモリに全て載せて再生するか、ストリームとして分割してメモリに載せて再生するかを指定できます。
しかも波形データなのでエフェクトがかけやすい事もあり、エコーや、データ毎のボリューム変更、ミキシング等一般的なオーディオ機器のDSPのような機能を持っています。
ただし、再生速度の変更が容易に設定できないという話を過去に聴いたことがあり、よくある「時間制限のあるゲームで、時間がなくなってくるとBGMの再生速度が上る…」といった処理の実現が大変という事を聴いたことがあります。この場合は、速度の速い曲をクロスフェードで切り替える方法を取ると良いとか…
(結局のところ、私はこの機能を使用したことがない&実装したことがないので、真偽は不明です(^^ゞ)
このようなことから、Javaの時同様に表を作成すると、
波形データ系 | |
ファイル拡張子 | .wav/.TIFF/.XMA |
音の種別 | 自然音 |
再生による音質の変化 | 基本的に変化無し |
データサイズ | とてつもなく大きい |
ボリューム等の プログラマブル 処理負荷 | とても小さい(XACT任せ) |
SEとして | ○ 向いている |
BGMとして | ○ 向いている (ただしデータサイズの 問題があるので△) |
のような感じでしょうか。
次回は具体的にXNAに付属している「Microsoft Cross-Platform Audio Creation Tool (XACT)」というツールを用いて、XACT用のプロジェクトの作成、XNAのプロジェクトへの登録を行ってみたいと思います。
XNAにおけるフレームワークのサンプルを紹介 (いままでのお浚い)
今回は、今迄説明してきた設計のお浚いとして、Xbox 360コントローラー(もしくはキーボード)を用いたサンプルプログラムを挙げてみたいと思います。
これは2/20に紹介したJavaの時のサンプルの3Dバージョンとなります。
■ サンプルソース(2008.04.15.zip)
【データ構成概要】

【実行画面】

(今回は奥行が分るような視点で表示しました)
実行すると今迄説明した自機が画面に表示されるので、これをコントローラーの左スティック、もしくはキーボードの左右にて移動することができます。
また、コントローラーのXボタン、もしくはキーボードのZキーを押下すると自機から弾が発射されます。ボタンを押しっぱなしにすると等間隔で連続して弾が発射されます。
このように今迄説明した設計を応用するとこのようなことが実現可能となります。
Javaの時の説明を繰り返しますが、これを何倍も味付けしていくと、本格的なテレビゲームが実現できることになります。(この「何倍も」というのがとても大変な訳なのですが…)
これは2/20に紹介したJavaの時のサンプルの3Dバージョンとなります。
■ サンプルソース(2008.04.15.zip)
【データ構成概要】

【実行画面】

(今回は奥行が分るような視点で表示しました)
実行すると今迄説明した自機が画面に表示されるので、これをコントローラーの左スティック、もしくはキーボードの左右にて移動することができます。
また、コントローラーのXボタン、もしくはキーボードのZキーを押下すると自機から弾が発射されます。ボタンを押しっぱなしにすると等間隔で連続して弾が発射されます。
このように今迄説明した設計を応用するとこのようなことが実現可能となります。
Javaの時の説明を繰り返しますが、これを何倍も味付けしていくと、本格的なテレビゲームが実現できることになります。(この「何倍も」というのがとても大変な訳なのですが…)