XNAゲーム開発日記

作りながら随時更新。
XNAで作ったゲームをXbox360へと転送し、実際にプレイする場合の色々なメモ。
開発環境: XNA Game Studio 3.1


何か長くなるかも。

全部の画面は出力されないことがある

例えば(0,0)の画面は画面外になり、映らないことがある。ウチのTVではまさにそうなった。
調べて見ると、SafeAreaというものがあるらしい。なるほど。
解決にはViewportを使うと良いらしい。

// Initalizeメソッド内辺りで取得しておくと楽かも
Viewport view = GraphicsDevice.Viewport;
Rectangle safeArea = view.TitleSafeArea;

[参考] http://blogs.msdn.com/ito/archive/2008/11/21/safearea-sample.aspx

C#ジェネリックの特別指定

ジェネリックで指定する要素が、特別な条件を持つ場合。
例えば、ジェネリックで指定する要素がIDisposableを必ず実装する場合は次の用にwhereを用いるらしい。(Thanks id:bleis-tift)

// 継承・実装無し
public sealed class Hoge<T> where T : IDisposable
// 継承・実装あり(HogeがIDisposableを実装)
public sealed class Hoge<T> : IDisposable where T : IDisposable

同様のコードはJavaでは、

public class Hoge<T extends IDisposable> ...

となる。extends / implementsは後に自由に書く。

C#のプロパティのアクセスレベルを変える場合

参考:http://ufcpp.net/study/csharp/oo_property.html

public int Hoge {
    get{ return hoge; }
    protected set{ hoge = value; }
}

……なんだかなぁ。

Cのtypedefの様に別名を付けて使いたい

C#ではusingがこれを行うらしい。
……が、なぜ、同一ファイル内のみなんだか。
ジェネリックとか結構使うはずだから、複数ファイルで別名を使うために定義したいという需要もありそうなものだが……
# Javaに比べて、出来るだけましという意見はあるかも。

namespace Hoge {
    // このファイル内のみHoge<LongLongNameClass>をPiyoとして扱える
    using Piyo = Hoge<LongLongNameClass>;
}

そろそろ怒りを覚えてくる

XNA用には普通の.NET Frameworkとは別のDLLが用意されるっぽい。
そのため、普通に使おうと思ってるクラス・メソッドが使えない可能性がある。(一応、その使用可能の可否はMSDNで見れるっぽいけれど)
まさかEnum.GetValuesすら使えないとは……要素の全列挙をいちいち書けってか?
本気でJavaenumが使いたいです……かといって、TypeSafeEnum自作するほどでもないしなぁ……うーん………

追記

参考:http://forums.xna.com/forums/t/1610.aspx
とりあえずEnum配列とMap(Dictionary)を使えば何とかはなる…