6

では、行きましょう。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 を使用しているため、テクスチャをストリームに保存して再読み込みすることはできません。実際、これを試してみると、少し危険で非常に遅いので、この方法は避けたいと思います。

4

1 に答える 1

0

以下の公式チュートリアル・サンプルはご覧になりましたか?

私の意見では、彼らはすべてを説明する必要があります。サンプルのダウンロード可能なソースもあります。

于 2014-01-14T09:36:33.713 に答える