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はゲームのようなエンターテーメント系の客先位しかリリース先は無いとも思っています)
コメント
No title
???
なんだろ、このコメントは…
「ニュース速報XBOX」…ほむほむ。
いつのまにかこのようなサイトに目をつけられているのかなぁ?
それとも誰かが「こんなのあるよ~」と貼りつけたか…
ネット検索すると、このブログがXNAの開発系リンクサイトとかにも登録されているみたいだし。(^^;
しかし、この記事による「trueSpace 7.6」が無償でアニメーションとか出力できても、XNAがアニメーションライブラリを標準で実装していないので、とても残念でしょうがないというのが私の最初に感じた感想です。
(こちらは現時点では自作のアニメーションエンジンを作った訳で…)
しかも、「XNA Game Studioで作成されたXbox360用の同人ソフト販売サービスも発表されていたが、同人分野では1本数十万円という価格帯が一般的な統合3Dソフトの導入が難点であった。このtrueSpaceの無償提供で、XNA関連分野の一層の活性化が期待される。」という内容が書いてありますが、別段他の優秀なフリーソフトの組み合わせで実現できるので、それ程難点とは思っていなかっただけに、「へぇ~。そうなんだ。」と思ってしまいました。
しかし、統合されたオーサリングになっている事と、元々は市販されていたレベルの素晴らしいソフトが無償になる訳で、これはスゴイ話だなぁ~とは思います。
確かに「活性化が期待される。」という言葉はうなづけます。
機会があれば使ってみましょう。(^^)
「ニュース速報XBOX」…ほむほむ。
いつのまにかこのようなサイトに目をつけられているのかなぁ?
それとも誰かが「こんなのあるよ~」と貼りつけたか…
ネット検索すると、このブログがXNAの開発系リンクサイトとかにも登録されているみたいだし。(^^;
しかし、この記事による「trueSpace 7.6」が無償でアニメーションとか出力できても、XNAがアニメーションライブラリを標準で実装していないので、とても残念でしょうがないというのが私の最初に感じた感想です。
(こちらは現時点では自作のアニメーションエンジンを作った訳で…)
しかも、「XNA Game Studioで作成されたXbox360用の同人ソフト販売サービスも発表されていたが、同人分野では1本数十万円という価格帯が一般的な統合3Dソフトの導入が難点であった。このtrueSpaceの無償提供で、XNA関連分野の一層の活性化が期待される。」という内容が書いてありますが、別段他の優秀なフリーソフトの組み合わせで実現できるので、それ程難点とは思っていなかっただけに、「へぇ~。そうなんだ。」と思ってしまいました。
しかし、統合されたオーサリングになっている事と、元々は市販されていたレベルの素晴らしいソフトが無償になる訳で、これはスゴイ話だなぁ~とは思います。
確かに「活性化が期待される。」という言葉はうなづけます。
機会があれば使ってみましょう。(^^)
コメントの投稿
« Sample Action Gameの紹介 [ステージ21(その1)] l Home l 昔のゲームの想い出 [0056] 「エイリアンシンドローム」 [セガ] [1987] [アーケード] »
http://news4xbox.blogspot.com/2008/07/3dtruespace-76.html