xnaに関する憶え書き
ファイル拡張子
pdb |
デバッグ用に使用されるファイル |
xnb |
Content Pipeline によって処理されたアセットデータ |
自前でグラフィックデバイスを作成しないでもあらかじめ用意された設定を利用できるクラス
Game.GraphicsDeviceからアクセスできるRenderStateやVertexDeclaration等
マネージャーを利用せず自分でGraphicsDeviceを作成する際に利用するクラス
3D処理に必要な行列(4×4の2次元配列)、行列に関わるメンバー関数等を収めたクラス
例えばビュー行列の場合、メンバーの CreateLookAt 関数を利用することで手軽に必要な行列を得ることが出来る。
この行列をエフェクトなどに渡すことで効果を反映させることが出来る。
頂点宣言。頂点の型やフォーマットをグラフィックデバイスに伝えるクラス
BasicEffect(自前でエフェクトファイルを作成しないでもあらかじめ用意された設定を利用できるクラス)
頂点データーを行列変換しピクセルとして描画する機能を統括するクラス(
HLSLの代理、本来はfxファイルが必要)
(Update更新推奨)
- ワールド行列(平行移動、回転、スケール)
- ビュー行列(カメラ位置、カメラターゲット、アップベクター)
- 射影行列(視野角、アスペクト比、近クリップ、遠クリップ)
(Draw更新推奨)
- テクニック、パスの処理開始、終了をフレームワークに知らせる処理など
ポリゴンの描画(基礎)
準備:ポリゴン表示に必要な要素であり、あらかじめ準備しておく必要があるもの。
- VertexDeclaration | 頂点宣言
- BasicEffect等 | HLSL(Hi Level Shade Language)を処理するエフェクト
- fxファイル(カスタマイズが不必要な場合、XNAにあらかじめ用意されたBasicEffectを利用可)
- VertexPositionColor等 | 頂点データそのものを格納する型
これらをXNAフレームワークのLoadContentやDraw内で適切に設定運用すればポリゴンを表示可能となる。
実装作業する際は、頂点データがPrimitiveType列挙型のメンバのどれに該当するか確認しておくと良い。
メモ:XNAのspriteBatch機能をシェーダーを利用することにより拡張(主にピクセルシェーダーを書き換えて利用することを推奨しているっぽい)
簡単なデバッグ方法
簡易的な値の表示を視認したい場合、ウインドウ枠のタイトル表示を利用するとprivateな値も表示可能となる。
例:
Window.Title = "ElapsedGameTime=" + gameTime.ElapsedRealTime + particles[1].Position;
ゲーム内の時間について
ゲーム内時間はXNAのUpdate関数やDraw関数で拾える「GameTime gameTime」を利用する。
ディフォルトでは60FPSに設定されている。プロパティはintの値が多いので適時float等に変換して使うと良い。
良く使うプロパティは以下の二つ。他のプロパティは
こちらを参照。
ElapsedGameTime |
前回の更新から経過したゲーム時間の合計 |
TotalGameTime |
ゲームの開始以降のゲーム時間の合計 |
サービスを使った疎結合
XNAではGameServiceContainerクラスによりインターフェイスを使ったサービスプロパイダーによるクラス間の疎結合を行うことが出来る。
常にXNAのフレームワークが持つGameプロパティを経由してサービスへとアクセスできる点に注目。
<定義側>
public interface IVisualProvider //サービスに登録する場合、インターフェイスに登録されたメンバーのみ外部からアクセスが許可されると思ってよい
{
IList<CMyShip> CMyShips { get; }
IList<CShot> CShots { get; }
}
/// <summary>
/// 外部に公開する視覚的なコレクション要素
/// サービスにより疎結合される共有クラス
/// </summary>
public class CVisualProvider :IVisualProvider
{
IList<CMyShip> cMyShip;
IList<CShot> cShots;
public IList<CMyShip> CMyShips
{
get { return cMyShip; }
}
public IList<CShot> CShots
{
get { return cShots; }
}
public CVisualProvider()
{
cMyShip = new List<CMyShip>();
cShots = new List<CShot>();
}
}
<実装側>
IVisualProvider visualProvider;
public Game1()
{
visualProvider = new CVisualProvider();
Services.AddService(typeof(IVisualProvider), visualProvider); //ここでサービスにインターフェイスを登録している
}
<外部クラスからの疎結合:継承してプロパティにより拾う>
IVisualProvider visualProvider;
protected IVisualProvider VisualProvider
{
get { return visualProvider; }
set { visualProvider = value; }
}
public CMover(Game1 game)
{
visualProvider = (IVisualProvider)game.Services.GetService(typeof(IVisualProvider)); //登録されたインターフェイスをサービスから取り出している
}
// これによりvisualProviderプロパティを利用して外部のクラスのインターフェイスで指定されたプロパティにアクセス可能となる
ゲーム製作の上で良く使う構造体やクラス
floatの値を収めることが出来る。Vector3の場合、第一、第二引数に一度にVector2を渡すことも可能。また第三引数に時間などのパラメータを入れるなどの利用用途もある
(三次元座標として扱う以外の使い方もあるという事。そのためVector4等もうまく利用すると良い)
vector2型で受け取る(つまりx,yというかたち)
画面情報を取得するのに便利なクラス
ガベージコレクションヒープのこと。
メンバーをconstしたりclassをstructすることによりガベージコレクションイベントを減らしてメモリを節約できたりするらしい。
これらはゲームが起動されゲームインスタンスのコンストラクタ処理やInitializeメソッド、LoadContentメソッドの処理が終わると上記の二つがループしはじめる。
無設定な場合、固定ステップで60FPSの頻度でupdateとdrawメソッドは交互に実行されるようにXNAは設計されている。
チュートリアルのメモ
- 衝突判定はモデルの形状メッシュからバウンディングスフィアを生成し、それに倍率操作して小さくし利用している。
- 衝突の検出もXNAの機能を利用している(BoundingSphere メソッド)
- 破壊時の非表示はフラグで管理されアステロイドの構造体配列や自機のデータは破壊時保存されたまま、見えなくしているだけ。
- GameConstants.NumAsteroidsの数だけアステロイドのデータを保持している(一画面内の敵の数みたいな感じ)
- アステロイド関係のデータはゲームの性格上、扱う機会が多いのでstructが使用されている。
- float timeDeltaが面白い。前回のアップデートの差分時間を各構造体のメソッドに渡して差分時間分、各要素(船やアステロイド等)を移動させている。
最終更新:2012年06月15日 16:48