C#

C#でゲーム開発

C# Advent Calendar 6日目の記事です。

続きを読む

[XNA 4.0] RenderTarget2D の深度バッファ設定

3D 描画を行うゲームのスクリーンショットを撮っていたら 3D モデルが一部描画されずに困っていました。


RenderTarget2D のコンストラクタのオーバーロードに以下のようなものがあります。
new RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height);
これで生成されるレンダーターゲットには深度バッファがないために、3D モデルが正常に描画されない場合があります。
深度バッファを使う時には以下のコンストラクタのオーバーロードを使います。
new RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat);
preferredDepthFormat に深度バッファの種類を指定することで深度バッファのあるレンダーターゲットを生成できます。

参考:[ひにけにXNA] XNA Game Studio 4.0におけるRenderTargetの変更点

Raynolds の群れシミュレーション

Boids という理論があります。
これは3つのルールを規定するだけで鳥の群れをシミュレーションできるというものです。
このシミュレーションを実際にやってみました。続きを読む

XAML でカスタムクラスを使う時の注意

解決したけど原因はよくわからない。忘れないように書いておく。というか忘れてた。

Visual Studio 2010 で発生しました。
確認してみたところ Visual Studio 2012 RC でも同様です。

アセンブリ Foo に XAML ファイルがあり、同じアセンブリ内の名前空間 BarNS 内にカスタムクラス Bar があるとする。
namespace BarNS
{
    public class Bar : ContentControl
    {
        public Bar()
        {
            // ごにょごにょ
        }
        // ごにょごにょ
    }
}
MSDN の XAML 名前空間および WPF XAML の名前空間の割り当て によると、
clr-namespace:(名前空間名);assembly=(アセンブリ名)
のようにして XML 名前空間を指定すればいいようなので指定します。
<Bar xmlns="clr-namespace:BarNS;assembly=Foo" />
こうするとデザイナでは問題なく動いています。
しかし、ビルドすると
タグ 'Bar' は、XML 名前空間 'clr-namespace:BarNS;assembly=Foo' にありません。
とか言われます。
ここで、先ほどの MSDN のページを見直すと
assembly は、参照される clr-namespace がカスタム クラスを参照しているアプリケーション コードと同じアセンブリ内で定義されている場合は省略できます。
とあります。
「省略できます」と書いてるんだから省略してもしなくてもどちらでもいいはずですが、省略してみます。
<Bar xmlns="clr-namespace:BarNS;assembly=" />
または
<Bar xmlns="clr-namespace:BarNS" />
すると、ビルドできました。

なんででしょうかねぇ。

ラムダ式の挙動

ラムダ式についてなぜか微妙に勘違いしていたのでメモ。

キャラクターを表すクラスにキャラクターの位置を表す Position 、キャラクターの1回の移動量を返す getMovement というメンバ変数がある。

using System;
using Microsoft.Xna.Framework;

class Character
{
    public Vector2 Position { get; set; }
    private Func<Vector2> getMovement;

    public Character()
    {
        getMovement = () => new Vector2(1, (float)Math.Sin(Position.X));
    }

    public void Update()
    {
        Position += getMovement();
    }
}

メインループで Update を実行すると getMovement の内容に応じて Position が変化する。

そして勘違いしていたのは getMovement のラムダ式で Position を使っている部分。
ここで Position は getMovement への代入時の値がそのままで Position が変わってから getMovement を実行しても同じ結果が返ってくると思ってた。
別にそんな事はなかった。 

ちゃんと getMovement の実行の度に Position プロパティにアクセスします。はい。


遅延評価って難しい。

asにゃん

class Azusa
{
    static void Main(string[] args)
    {
        object 中野 = new にゃん();
        var あずにゃん = 中野 as にゃん;
        あずにゃん.にゃあ();
    }
}

class にゃん
{
    public void にゃあ()
    {
        Console.WriteLine("にゃあ~");
    }
}

この前ふと思いついたネタ。

人生の時計

少し前にSONYがGO FOR ITというソフトウェアスペシャリスト認定コンテストを開催しました
http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/go_for_it.html 
僕は応募資格を満たしていなかったので応募していないですが 、面白そうだったのでこの問題の一つ
人生の時計を解いてみました。続きを読む

IronScheme

無事に卒研発表もおわり、とりあえず余裕ができました。

今回はIronSchemeというライブラリの紹介をします。続きを読む
QRコード
QRコード