では、行きましょう。XNA のレンダラーをベースとして、アプリケーションを作成しようとしています。このプロジェクトで必要なことの 1 つは、別の XNA レンダー パネルが埋め込まれた新しいウィンドウを (ダイアログとして) 開くことです。これをインタラクティブなプレビュー パネルとして使用しているので、そこでレンダリングするには XNA が絶対に必要です。ただし、XNA にはこれを行うための十分な機能が備わっていないようです。私は自分でさまざまなことを試しましたが、役に立ちませんでした(エラーが発生して正しくレンダリングされない、または間違ったアスペクト比でレンダリングされるなど)。通常、私はここにコードを投稿しますが、運がほとんどなかったため、投稿することはあまりありません。
私のアプリケーションは現在、フォーム内に埋め込まれた XNA アプリケーションで構成されており、プレビュー パネルを開くボタンがあります。これは、理論的には XNA レンダラーを含むフォーム ダイアログとしてポップアップし、プレビューを描画できるようにする必要があります。私はこれを数時間試しましたが、どこにも行きませんでしたので、ここで少し助けを求めています.
とにかくありがとう。
編集:わかりました、少し進歩しましたが、2 つの問題があります。まず、スプライト バッチで描画されたテクスチャは正しい寸法で表示されますが、黒一色で塗りつぶされます。また、ダイアログを開いて閉じ、アプリケーションを閉じると、AccessViolationException が発生します。私は、2 つのエラーが何らかの形で関連していると強く疑っています。
これがプレビューダイアログを初期化する私のコードです。(a は基本的に Texture2D オブジェクトの LinkedList で構成されるカスタム クラスです)。
animPrev = new AnimationPreview(a);
animPrev.Show();
私の AnimationPreview クラスは Form クラスの拡張であり、XNA Winforms サンプルにある GraphicsDeviceControl の拡張である PreviewControl オブジェクトを含みます。私のメイン フォームは、さまざまな理由から XNA Game クラスを拡張していることに注意してください。
PreviewControl オブジェクトは次のように設定されます。
protected override void Initialize()
{
sb = new SpriteBatch(GraphicsDevice);
Application.Idle += delegate { Invalidate(); };
}
Draw メソッドには以下が含まれます。
protected override void Draw()
{
GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.Violet);
if (frame != null)
{
sb.Begin();
sb.Draw(Image, Vector2.Zero, Color.White);
sb.End();
}
}
これにより、予想どおり、紫色のフォームの背景がクリアされ、Image と同じサイズの黒いボックスが描画されます。これは想定外です。うまくいけば、誰かがここで私を助けてくれます。
注: 受け入れられる代替手段は、XNA Texture2D オブジェクトを System.Drawing.Image オブジェクトに変換することです。ただし、XNA 3.1 を使用しているため、テクスチャをストリームに保存して再読み込みすることはできません。実際、これを試してみると、少し危険で非常に遅いので、この方法は避けたいと思います。