BasicEffect

BasicEffectとは XNAはShader Model 1.1以上のビデオカード向けに設計されていて、固定シェーダーが使えません。これは、昨今のゲームのグラフィクスにはシェーダープログラムが欠かせなくなっていること、DirectX 10でも固定シェーダーが廃止されたことが主な理由です。また、仮に固定シェーダーをサポートした場合、設計思考が違うものを一緒にすることによるライブラリの複雑化、マルチテクスチャの細かい部分の振る舞いがGPUによって違い、しかもその情報量が少ないという問題もあります。 以上の理由から、XNAではシェーダプログラムが使える事が前提となっています。しかし、いきなりシェーダープログラムを書くというのでは敷居が高すぎるので、固定シェーダーの代表的な機能を簡単に使えるようにしたのがBasicEffectクラスです。 BasicEffectには以下の機能があります。 ライティング マテリアル(DiffuseColor、SpecularColor、EmissiveColor) 3つの鏡面光(Specular)つき平行光源(Directional Light) テクスチャ(シングルレイヤーのみ) 頂点カラー フォグ(視点からの距離によるもの) これらの機能をコントロールするために、BasicEffectにはLightingEnabled、TextureEnabled、VertexColorEnabled、そしてFogEnabledプロパティがあります。ここで重要なのは、これらのプロパティを変更した場合、BasicEffectは使用するシェーダーを切り替え、特に最初の3つプロパティによって頂点シェーダー内で参照する頂点データが変化するということです。以下は各プロパティと頂点データの対応表です。 プロパティ 対応する頂点データ LightingEnabled VertexElementUsage.Normal TextureEnabled VertexElementUsage.TextureCoordinate VertexColorEnabled VertexElementUsage.Color  頂点データに対応するデータがない場合、例えばLightingEnabledをtrueにしたのに指定した頂点データにNormalが含まれていない場合の動作は未定義となっています。特にDirectX SDKを入れてデバッグモードにしている環境では例外処理が発生するので、自分のところでは動いていても、友達のPCだと動かなかった、なんてことになってしまうので注意が必要です。 これらのプロパティは全て既定値がfalseとなっています。ですから、BasicEffect.Textureにテクスチャをセットしただけではテクスチャが表示されないので、テクスチャを使う時はBasicEffect.TextureEnabledをtrueにすることでテクスチャが表示されます。   BasicEffectで簡単ライティング XNAで初めて3Dプログラムを始める人にはもちろん、3Dプログラムに慣れている人でもライティング設定は面倒な作業です。この作業を軽減する為に、BasicEffect.EnableDefaultLightingというメソッドがあります。このメソッドを呼ぶことで以下のライティング設定が適用されます。 名前 色 方向 スペキュラ キーライト   左奥、下方 あり フィルライト   右手前、上方 なし バックライト   右手前、下方 あり このキー、フィルそしてバックライトの3つの光源を使うのがライティングの基礎になり、実際に映画やドラマなどではこれらを基本としたライティングが使われています。暗いシーンで効いてくるのが、被写体の輪郭を背景から浮かび上がらせる効果のあるバックライトです。以下の2枚のスクリーンショットは実際にGSEで撮ったもので、左がキーライトのみ、右がキー、フィル、そしてバックライトの3つを使ったものです。        左側のスクリーンショットでは、機体の下の部分が背景に溶けこんでしまっているのに対して、右側ではシルエットがハッキリとしていて、機体の丸みが判り、より立体的に見えます。 ライティングはそれだけで本が書けるくらい奥が深いのですが、EnableDefaultLightingを使うことで簡単にライティング効果を得ることができるので、試しに使ってみるのはどうでしょうか?


SpriteBatchクラス その2

SpriteBatch.Beginはレンダーステートを変更する SpriteBatch.Beginメソッドにはブレンドモード、ソートモード、そしてステートモードの3つ引数を渡すメソッド以外に、引数を省略できる2つのオーバーライドがあります。引数を省略した場合、ブレンドモードはSpriteBlendMode.AlphaBlend、ソートモードはSpriteSortMode.Deferred、そしてステートモードはSaveStateMode.Noneとなります。 ここで重要なのはステートモードがSaveStateMode.Noneということで、SpriteBatch.Begin()、またはSpriteBatch.Begin(SpriteBlendMode blendMode)を呼んだ場合は、レンダーステートが変更されてしまうということです。変更されるレンダーステートは指定するSpriteBlendModeによって変わりますが、共通して以下のレンダーステートを変更します。 GraphicsDevice.RenderState.CullMode = CullMode.CullCounterClockwiseFace; GraphicsDevice.RenderState.DepthBufferEnable = false; GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Clamp; GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Clamp; GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Linear; GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Linear; GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Linear; GraphicsDevice.SamplerStates[0].MipMapLevelOfDetailBias = 0.0f; GraphicsDevice.SamplerStates[0].MaxMipLevel = 0; これ以外にも、GraphicsDeviceのVertices、Indices、VertexDeclaration、VertexShader、そしてPIxelShaderが変更されます。 そして、以上に加えて、SpriteStateMode.Noneでは以下のレンダーステートが変更されます。 GraphicsDevice.RenderState.AlphaBlendEnable = false; GraphicsDevice.RenderState.AlphaTestEnable = false; SpriteStateMode.AlphaBlendの場合は以下のレンダーステートが変更されます。 GraphicsDevice.RenderState.AlphaBlendEnable = true; GraphicsDevice.RenderState.AlphaBlendOperation = BlendFunction.Add; GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha; GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha; GraphicsDevice.RenderState.SeparateAlphaBlendEnabled= false; GraphicsDevice.RenderState.AlphaTestEnable…


SpriteBatchクラス その1

 SpriteBatchクラスはWindows/Xbox360上で効率的に2D描画をするために設計されています。SpriteBatchで使える機能としては以下のものがあります。 回転とスケーリング ソーステクスチャ領域の指定 カラーモジュレーション バッチ処理とソーティング スプライトの回転とスケーリングを使う場合に気をつける点はOriginパラメーターを指定しない場合は、回転、スケーリングはスプライトの左上を原点として扱います。 上図は、原点の違いによる回転結果の違いです。キャラクターなどをスプライトを使って描画する場合、特に多間接キャラクタなどを表現する場合はOriginを指定することが多いと思います。 また、テクスチャの一部分の矩形を指定できるので、一枚のテクスチャに複数のキャラクタのアニメーションを描いたり、ビットマップフォントなどで指定の文字の部分を描くといったことができます。 カラーモジュレーションはColorパラメーターで指定したカラーとテクスチャカラーを乗算した結果が描画されます。テクスチャのそのままの色を使う場合はColor.Whiteを使います。使用例としては夕焼けのシーンで赤い色をColorに指定したり、キャラクターが現れる時にカラーのアルファ値を時間と共に変更することで徐々に現れたり、消えたりといった演出にも使えます。 バッチ処理とソーティング 現在のGPUは、大量のポリゴンを描画するように設計されていますが、そのパフォーマンスを得るためにはテクスチャ変更といったレンダーステートの変更を極力少なくする必要があります。例えば木と岩の2枚のテクスチャがあった場合、木のテクスチャのスプライトを100枚続けて描いた後に岩のテクスチャのスプライトを100枚描くのと、岩と木のテクスチャを交互に切り替えて10枚(書き間違ではない)描いた方が遅いなんていうこともあります。 見下ろし型の2Dベースのゲームを作る場合、地面があり、その上に岩や木といったオブジェクトがあり、更にその上に半透明の雲があるようなシーンを作る場合、以下のようにSpriteBatchを使うことで実現できます。 地面部分を描く場合、その殆どがアルファブレンディングの必要がないので、SpriteSortMode.Textureを設定します。この時、SpriteBatchクラスはDrawで呼ばれたパラメーターを内部バッファに保持しておき、SpriteBatch.Endが呼ばれた時に使われているテクスチャの順に並び替えてから、まとめて描画します。テクスチャ変更の回数を少なくすることによって、GPUが効率的に描画することができます。 次に、木や岩といったオブジェクトを描く場合に重要なのは、オブジェクトの前後関係です。この場合、SpriteSortMode.BackToFront、またはSpriteSortMode.FrontToBackを使用します。スプライトはDrawメソッドのdepthLayer引数の値によって並び替えられた後に描画されます。depthLayer引数は0~1までの浮動小数点の値で、0が手前側(Front)、1が奥側(Back)になります。ですから、通常はSpriteSortMode.BackToFrontを指定します。 最後に雲の描画になるわけですが、これも単純にSpriteSortMode.BackFrontを使って、雲の高さをdepthLayerに指定することで実現できます。 // 背景を描く spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Texture, SaveStateMode.None); spriteBatch.Draw(…); spriteBatch.End(); // 木や岩といったオブジェクトを描く spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront, SaveStateMode.None); spriteBatch.Draw(…); spriteBatch.End(); // 雲を描く spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront, SaveStateMode.None); spriteBatch.Draw(…); spriteBatch.End(); まとめると以上のようなコードになります。このようなケースではSpriteSortModeを指定するだけで実現できることが多いですが、ゲーム側で描画の順番などを制御したい場合はSpriteSortMode.Immediateを使います。SpriteSortMode.Immediateを使った場合、SpriteBatchは並び替えの処理などをせずにDrawを呼んだ順にスプライトを描きます。この場合でも、同じテクスチャが続けて使われている場合はバッチ処理の対象となるので、呼び出し側で調整することでパフォーマンスを得ることができます。 また、SpriteSortMode.Immediateと他のソートモードとの違いとして、スプライトを描画するのに必要なレンダーステートは、他のソートモードではSpriteBatch.End内で設定されるのに対して、SpriteSortMode.Immediateの場合はSpriteBatch.Begin内で設定されます。ですから、SpriteBlendModeで用意されているブレンドモード以外のものを使いたい場合などにSpriteSortMode.Immediateを設定することができます。 SpriteBatchは描画するのに必要なレンダーステートを設定しますが、その事については次回で詳しく説明します。


XNA Game Studio Expressアップデート

追加:日本のXNAチームブログの方に詳しい情報が載ってました。  XNA Game Studio Expressアップデートが4月からダウンロードできるようになります。この更新は主にフィードバックを元にした変更になっています。詳細は以下の通り。 XNA Game Studio Express Windows Vista対応 ゲーム用のアイコン追加機能 インクリメンタル・デプロイメント(配置) XNA フレームワーク ビットマップベースのフォントクラス XACT 3Dオーディオ Math関連の機能追加 BasicEffectのパーピクセルライティングのサポート コンテント・パイプライン ボリューム・テクスチャ(Texture3D) コンテントビルド中にキャンセルができるようになった クリーンビルドのサポート ModelクラスのVertexBufferとIndexBufferの情報が取得できるようになった XNA Gmae ラウンチャー(Xbox 360) ゲームサムネイルの表示 コネクションキーによる接続の使いやすさ向上 PC~Xbox 360間の接続のテストと診断機能の追加  バイナリシェアのサポート ゲームバイナリのパッケージ製作 作ったバイナリパッケージは自由に配布できる パッケージをダブルクリックするだけで、PC/Xbox360上へのアンパックができる(ただし、Xbox 360上ではCreators Clubに入っている必要がある)  以上の殆どがユーザーからのフィードバックを元にしています。これからもXNAを良くするために皆さんからのご意見ご希望などをXNAチームメンバ一同待っています。  


ゲームプログラミング開始

前回は、XNA Game Studio Expressでゲームプロジェクトを新規作成したときに生成されるテンプレートコードの中身の説明をしました。今回は、ゲームプログラムの基本となる以下のものを実装、つまりコーディングをします。 コンテントの読み込み SpriteBatchを使ったスプライト表示 コントローラーによる移動 今回は、簡単な説明に留めますが、次回からはそれぞれについて詳しく説明していきます。   コンテントの読み込み XNAにはビットマップ、3Dモデル、オーディオといったゲームを作る上で必要なコンテントを簡単に、効率よく使うためのコンテント・パイプラインというものがあります。全てのコンテントは、プロジェクトをビルドした時に、コンテント・パイプラインによって処理され、Windows/Xbox360上で効率良く使えるデータ形式に変換されるようになっています。また、それぞれのゲームで独自形式のフォーマットを取り扱えるようにカスタマイズできる機能を持っています。 今回使うコンテントは、左の飛行機の絵が一枚だけです。XNAでは全ての画像データはテクスチャとして変換されます。コンテントのプロジェクトへの追加はソートコードの追加と同じで、ソリューション エクスプローラからコンテントを追加するプロジェクトを右クリックしてメニューを開き、その中の追加/既存の項目を選びます。 ダイアログボックスが開いたら、ファイルの種類をContent Pipeline Filesにしてから追加したいコンテントを選びます。 GSE 1.0では以下のファイルフォーマット形式がサポートされています。 3Dモデル 2D画像 マテリアル オーディオ .FBX.X .DDS .BMP.JPG .PNG.TGA .FX .XAP(XACT) プロジェクトディレクトリ直下に直接コンテントを追加してもいいのですが、コンテントとコードの区別がつくようにプロジェクトディレクトリの下にContentというディレクトリを作っておくと便利です。また、この場合、ContentManagerの初期化の時(Initializeメソッド内)にコンテントのルートディレクトリを指定しておくと、コンテントの読み込みの時に”Content/アセット名”と書かずに済みます。 // コンテントのルートディレクトリを”Content”に設定する content = new ContentManager(Services, “Content”); 実際のコンテントの読み込みをする為には以下のようなコードをLoadGraphicsContentメソッド内に書きます。 // 飛行機用のテクスチャを読み込む airPlaneTexture = content.Load<Texture2D>(“air-plane”); ContentManagerクラスにはLoad<T>という、ジェネリクスメソッドがあり、どのような型のコンテントでも同じようにして読み込むことができます。.Net 2.0ならではの機能であるジェネリクスを使うことによって、今までのようにLoadTexture2D、LoadMeshFromFileといった、長い関数名を覚える必要もなく簡単にコンテントを読み込むことができます。   スプライトの描画 XNAでは簡単にテクスチャイメージを描画する為のSpriteBatchというクラスがあります。なぜ単にSpriteではなく、SpriteBatchという名前になっているかというと、このクラスは複数のスプライトをまとめて処理(バッチ処理)する機能をもっているからです。詳細については別の投稿で説明しますが、簡単に言うとWindows/Xbox360の違いを気にせずに、高パフォーマンスを実現しながらも、簡単に使える便利なものといった感じです。 // SpriteBatchに描画開始を伝える spriteBatch.Begin(); // 飛行機のテクスチャを指定した座標に表示する spriteBatch.Draw(airPlaneTexture, airPlanePos, Color.White); //…

2

いろいろアナウンス

XNAチームブログでXNAに関する幾つかのアナウンスがありました。 Creators Clubのオンライン・コミュニティのサイトが開設! http://creators.xna.com/では以下のコンテントが提供されています。 新しいスターターキット(Marblets) 複数のサンプルコード コンテントパイプラインを使ったスキンアニメーション フォント描画 サンプルゲー 新しいフォーラ ビデオチュートリアル Dream-Build-Playのメインコンテスト開催 優勝者には1万ドルの賞金、AMD 64 FX-62搭載のPCにSoftimage、3ds Max、Mayaのいずれかの3Dツールといったものに加え、作った作品がXbox Liveアーケードで配信できる権利が授与されます。期限は北米時間の7月2日までとなっています。詳しくはhttp://www.dreambuildplay.comに書いてあります。 Creators Club年会費を払う価値 現在、Xbox360上でCreators Club会員になっている人は、Creators Club プレミアム会員と呼ばれるようになり、前述のCreators Clubサイトでの特典が得られる他に、5月以降からは更に以下の特典があります。 GarageGames Torque X Engineのツールを含むライセンス。 Creators Club会員向けのSOFTIMAGE|XSIベースのゲーム製作者向けのツールの提供(年内) Allegorithmic ProFX、MapZone 2-Dテクスチャツール(年内)。プロシージャル(算術合成)でテクスチャを生成するツール&ランタイムからなり、RoboBlitzではDXT圧縮で80MB相当のテクスチャデータを280KBのデータから4秒で生成しているそうです。 これでCreators Club年会費は、Xbox 360上で実行する為の料金以上の意味を持つことになるわけですね。

1

アプリケーションモデル その1 ~Gameクラス~

これまで概要的な話をしてきましたが、今回からは実際のプログラミングについての話をしていこうと思います。 今回は以下の動作を実装します。 ウィンドウの作成 グラフィクスデバイスの生成 デバイスロストの管理 ゲームのメインループ 画面を指定の色で塗りつぶす DirectXやMDXで以上の作業をするのには、かなりの量のコードを書く必要があり、特にデバイスロストの管理は複雑で、ウィンドウのリサイズ時はもちろん、マルチモニタでのモニタ間のウィンドウ移動、フルスクリーンへの切り替え、スクリーンセーバーが立ち上がったとき、PCがスリープ状態に入ったときなどに対応するには、少なくとも1,000行以上のプログラムを書かないといけません。 DirectXでゲームを作りたい!と思った人が、いざプログラムを始めようとすると、いきなり最初からこんな難関を乗り越えないといけないのは大きな障害以外のなにものでもありません。確かにプロジェクトテンプレートを使えば以上のことはコーディングなしで実現できますが、やはり大量のコードを管理するというのは面倒なことだし、ゲーム製作自体には関係のないことです。 XNAでは、これらの問題に加えて、PC/Xbox360の両プラットフォームでのゲーム開発を容易にするために、アプリケーションモデルがあります。XNAのアプリケーションモデルでは、今回の実装を実現するのに100行程度のコードで、テンプレートも用意されているので実際にコーディングする必要はありません。   以下のコードはXNA Game Studio Express上から、ファイル/新しいプロジェクトを選んだ後にWindows GameかXbox 360 Gameを選ぶことで自動的に生成されるコードです。実際には英語のコメントですが、ここでは翻訳されています。PCとXbox360のコードは完全に同じものです。 /// <summary> /// ゲームのメインクラス /// </summary> public class SampleGame01 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; ContentManager content; public SampleGame01() { graphics = new GraphicsDeviceManager(this); content = new ContentManager(Services); } /// <summary> /// ゲームの実行する前に初期化必要なものを処理する。 /// ここで必要なサービスの検索や、非グラフィクス系のコンテントの読み込みをする。 /// base.Initializeを呼ぶことで登録されたコンポーネントの初期化する。 ///…


まずは準備から

前回は、XNAの概要について書きました。これからはXNA上でゲームを製作する時に注意する点や、知ってもらいたい事などを開発者という立場から、書いていこうと思います。 と、その前に今回はXNAでゲームを作る為に現時点で必要なものを記します。 開発環境 Windows XP SP2 Visual C# 2005 Express Edition .Net Framework 2.0が付属してくる XNA Gmae Studio Express 1.0(先にC# Expressがインストールされてる必要がある) .Net 1.1フレームワーク(XACTツールを使う場合) PCゲームの動作環境 DirectX 9.0cをサポートしているビデオカード(シェーダーモデル 1.1必須、シェーダーモデル2.0奨励) .Net 2.0フレームワーク DirectX 9.0 End-USer Runtime Xbox360ゲームの動作環境 Xbox360 HDD Creator’s Clubの会員であること(有償) スキル ある程度のプログラミング能力(C#の知識があるのが好ましい) ゲームで使われる数学の理解力(2Dなら三角関数程度) 「ゲーム作りてぇ」というやる気 ここまで読んで「え?プログラミングができないとだめなの?」と思った人もいると思います。どうしても会社としてアナウンスするときには「ゲームがすっげぇ簡単に作れる」といったキャッチフレーズばかりが先行して、実際にXNAってのはなんなの?というのが置き去りにされてしまいがちです。実際、北米でベータ板を公開した頃はXNAというのはアンリアル・エンジンのようなゲームエンジンだと思われたり、日本で言うところのRPGツクールのようなものだと思った人達が沢山いました。 そう思った方々には残念ですが、現時点ではXNAでゲームを作る際にはある程度のプログラミング知識が必要になります。もちろん、実際にXNAを使ってくれる人達の要望によってXNAはひにけに(日ごとに)変わっていくので、ご意見ご要望があればフォーラム等に気軽に投稿してくれるとうれしいです。

2

XNAフレームワークってなに?

  浅春のみぎり、時下ますますご清祥の段、お慶び申し上げます。毎々格別のご愛顧を賜り、厚く御礼申し上げます。 ……… ダメだぁ、もう丁寧な日本語が書けない体(どんな体よ?)になってる……。個人のブログは家でまったりと、机の上で寝ているねこさん達を撫でながら好好爺然として書いていますが、このブログは会社で書いているせいかテンションが高い?ので、日本のビジネスマナーである丁寧語や美辞麗句、甘言(?)といったもの抜きでサクサクと書いていこうと思います。   XNAフレームワークはゲームを作るのを目的としてデザインされたマネージド・クラスライブラリ群です。DirectXも、元々はゲームを作るためのライブラリとして設計されていたのですが、現在では多岐に渡る機能を詰め込んだ変わりに、非常に複雑化してしまい、遂にはDirectXはゲームエンジン作成者の為のライブラリとまで言われることが多くなりました。 また、DirectXではゲームを実際に実行しているとき(ランタイム)に使うAPIと、ゲーム開発時(オフライン)に使われるAPIの区別が明確ではない場合があり、間違った使い方をしてしまうと、実行速度が本来出せる性能の半分以下の性能しかだせないということがあります。 例えば、ID3DXMeshは手軽にXファイルの読み込みと表示ができるという触れ込みですが、うっかりOptimizeMeshやD3DXWeldVerticesといった関数を呼ぶのを忘れてしまうと、思わぬパフォーマンス低下に繋がります。 XNAチームの目標は、ゲーム製作者がプロジェクトを新規作成してから5分以内でゲームのコードが書けるということです。個人的にはこれを「玄関開けたら、5分でゲーム製作」と呼んでいます。   左図(クリックすると別ウィンドウで開きます)は、XNA Framework 1.0の構造図です。下から順に、プラットフォーム、コア・フレームワーク、拡張フレームワーク、そしてゲームといったレイヤに分かれています。 プラットフォームレイヤはPCやXbox360といったハードを効率よく使うためのネイティブな部分です。Xbox360上からは、セキュリティ上の問題からこの部分には直接アクセスできません。 その上にはXNAフレームワーク最初のレイヤであり各プラットフォームを仮想化するコア・フレームワークがあります。コア・フレームワークでは厳密にはプラットフォーム間での違いがありますが、その差は小さく、殆どの場合はPCとXbox360上で同一のコードで動作させることができます。 続いて拡張フレームワークですが、このレイヤではゲーム開発をより簡単にするための機能が提供てされています。ゲームのメインループを含むアプリケーション・モデルや、コンテント・パイプラインはここに位置します。 最後にゲーム・レイヤになりますが、ここにはゲーム製作者が作るゲームコードやコンテント、またコミュニティによって提供されるコンポーネントなどが位置しています。   以下に、それぞれの機能の概要を記します。   アプリケーション・モデル(Application Model) ゲーム製作者がゲームを作ることに集中できる環境を提供しています。ウィンドウの初期化やメッセージハンドリング、タイマーの設定、GraphicsDeviceの初期化などをPC/Xbox360の両プラットフォームで同じ扱いができるGameクラス、コミュニティ間でコードの流用がしやすいように設計されているGameComponentなどのクラスがあります。   コンテント・パイプライン(Content Pipeline) XNA独自の機能のひとつでユーザーの視点からすると、他のWindowsアプリケーション開発と同じ感覚で、テクスチャや3Dモデル、サウンドといったコンテントをプロジェクトに追加するだけでゲーム上で簡単に使えるというものです。表向きの便利さ同様に拡張性にも優れていて、独自のインポーターやプロセッサを用意することで自由にカスタマイズすることができ、PC/Xbox360の両プラットフォームで最適に動作するコンテントを容易に扱うことができます。   グラフィクス(Graphics) Managed DirectX 2.0 (MDX 2.0)をベースとして、より使いやすく、.Netデザインガイドラインに則したものになりました。大きな変更点としては、固定機能パイプライン(FFP)の機能が外されました。これはFFPとシェーダーモデルでは、プログラミングモデルが大きく異なることと、Xbox360やDirectX10に見られるように将来的にシェーダーモデルが主流となると判断した結果です。 シェーダーモデルプログラミングを最初から組むのは難しいので、2D描画を簡単に行えるSpriteBatchや、3Dモデル描画用のBasicEffect、Modelなどのクラスが用意されています。   オーディオ(Audio) XNAのオーディオサポートは、XACTというPC/Xbox360両プラットフォームに対応しているサウンドライブラリを使用しています。GSEに付属しているXACTオーサリングツールで、サウンドバンクやウェーブバンクといったパッケージを作ることができ、そのパッケージを使うことで簡単に効果音やBGMを鳴らすことができます。ウェーブデータの圧縮にはPC上では圧縮率4:1のADPCMが使え、Xbox360上ではWMAをゲーム用にカスタマイズした圧縮率が6:1~12:1のXMAが使えます。     入力(Input) XNAではXbox360用のコントローラーと、キーボードをPC/Xbox360の両プラットフォームで使うことができ、PC上でマウスを使うことができます。イベント駆動式ではなく、フレーム毎にステートをチェックするという形式になっています。振動機能はGamePad.SetVibration関数でXbox360コントローラーの左右に内蔵されている振動用のモーターを速度を自由に変更できるようになっています。   数学(Math) Vector2、Vector3、Vector4、Matrix、そしてQuaternionと言った基本的な構造体の他にBoundingBox、BoundingFrustum、BoundingFrustum、Ray、Planeといったプリミティブがあり簡単な衝突判定に使えるようになっています。特にBoundingFrustumはビュー、プロジェクション行列から生成することができるので、オブジェクトの可視判定に最適です。 従来のDirectXやMDXとの最大の違いとして、右手座標のみのサポートがあります。これは、コードを開発者の間で流用する時に右手、左手の両方があると、余計な混乱の元になるとの判断からです。   ストレージ(Storage) ゲームでのセーブデータの保存、読み込みをサポートするためのもので、PC/Xbox360の両プラットフォームで使用可能です。Xbox360上ではHDD、メモリカードのどちらにもデータを保存することができます。PC上でのセーブデータの上限はOSに依存しますが、Xbox360上では最大2GBまでのデータの保存ができます。   以上がXNAフレームワークの概要です。次回からは、それぞれの機能の詳細を紹介します。    参照リンクXNA Team Blog ”What…


ゲームはたのしく作ろう

私がXNAチームに入ったのは、去年の2月でした。それまでは1993年のボンバーマン’94を初めとして、ブルートフォースといったゲーム開発に15年近く携わってきました。   ゲームをするのも作るのも好きなので、いつも楽しみながらゲーム製作をしてきました。ですが、肥大化する昨今のゲーム製作現場では、ツール製作といったゲームに直接関係の無い作業に長時間掛かることが日常になり、それがあまりに長くなりすぎて自分の本業がゲームを作ることなのか、ツールを作ることなのか判らなくなることが少なからずありました。 昔は、開発チームの人達と「こんなことができたら、面白いよね」、「じぁ、やってみようよ」といった感じで、思いついたアイディアを直ぐに試すことができたのですが、今のゲーム製作現場ではそれは難しいことになってしまいました。ゲームの肥大化に伴い、制作費も大きく膨れ上がり、会社としても危険を冒してまで新作を投入するよりも、既に売れているゲームの続編を出すけど、ユーザーは代わり映えのしないゲームから離れていってしまう。   これは、ちょっとヘンだぞ、なんとかしなければ   と、常に考えるようになったときに偶然出会ったのが、XNAプロジェクトでした。それまではXNAってなんだかよく分からないものだったのですが、プロジェクトリードのBoyd Multerer氏に会って、その構想を聞いたときに「自分が探していた答えはこれだっ!」と確信し、XNAチームに入ることになりました。   個人的にXNAが目指すべき目標は「ゲームを楽しみながら作れる」環境を提供することだと思います。違う言い方をすれば、XNAを使った人達がゲーム作りに集中できるような環境を提供することです。 現段階ではまだまだ足りない部分が多いXNAですが、XNAを使って下さる皆さんが少しでも、ゲームを作るのはたのしいと感じていただければ幸いです。たのしくないぞ、と感じた方には今後の改善のために、お手数でも意見をお聞かせ願えれば幸いです。