2012-10-06 89 views
6

Bien, entonces aquí vamos. Estoy intentando hacer una aplicación, usando XNA como base debido a su procesador. Una de las cosas que es necesaria en este proyecto es abrir una nueva ventana (como un diálogo), en la que se incrusta un panel de renderizado XNA separado. Estoy usando esto como un panel de vista previa interactivo, por lo que absolutamente necesito que XNA lo represente allí. Sin embargo, parece que XNA no está muy bien equipado para hacer esto. He intentado varias cosas por mí mismo, pero fue en vano (ya sea produciendo errores y no presentando correctamente, o haciendo una relación de aspecto incorrecta, etc.). Normalmente, publicaría el código aquí, pero como tuve tan poca suerte, no hay mucho para publicar.XNA con Windows Forms - Abriendo nueva ventana

Mi aplicación actualmente consiste en una aplicación XNA incrustada dentro de un formulario, y tengo un botón para abrir el panel de vista previa, que en teoría debería aparecer como un cuadro de diálogo de formulario, que contiene el renderizador XNA, para permitirme dibujar el avance. Lo he intentado durante varias horas y no he llegado a ninguna parte, así que pido un poco de ayuda aquí.

Gracias, de todos modos.

EDITAR: Bien, he hecho un pequeño progreso, pero tengo 2 problemas. En primer lugar, las texturas dibujadas con un lote de sprites aparecen con las dimensiones correctas, pero rellenas con negro sólido. Además, cuando abro el diálogo, y luego lo cierro, y cierro la aplicación, obtengo una AccessViolationException. Sospecho fuertemente que los dos errores están relacionados de alguna manera.

Aquí está mi código inicializando el diálogo de vista previa. (a es una clase personalizada que esencialmente consiste en una LinkedList de objetos Texture2D).

animPrev = new AnimationPreview(a); 
animPrev.Show(); 

Mi clase AnimationPreview es una extensión de la clase Form, y contiene un objeto PreviewControl, que es una extensión de la GraphicsDeviceControl encontrado en la muestra de XNA Winforms. Tenga en cuenta que mi formulario principal amplía la clase XNA Game, por varias razones.

objeto

El PreviewControl está configurado de esta manera:

protected override void Initialize() 
{ 
    sb = new SpriteBatch(GraphicsDevice); 
    Application.Idle += delegate { Invalidate(); }; 
} 

Y el método Draw contiene:

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(); 
    } 
} 

Esto borra el fondo de la forma violeta, como se esperaba, y dibuja un cuadro negro del mismo tamaño que Image. Esto no es esperado. Espero que alguien pueda ayudarme aquí.

NOTA: Una alternativa aceptable sería convertir objetos XNA Texture2D en objetos System.Drawing.Image. Sin embargo, estoy usando XNA 3.1, así que no puedo simplemente guardar la textura en una secuencia y volver a cargarla. En realidad, después de haber probado esto, es un poco dudoso, y muy lento, así que preferiría no hacerlo de esta manera.

+2

¿Está utilizando [XNA WinForms Sample] (http://xbox.create.msdn.com/en-US/sample/winforms_series1)? (Porque, si no, ese sería el paso # 1.) –

+0

No, lo echaré un vistazo. – Hoeloe

+0

Hmm ...parece ser casi lo que estoy buscando, pero tiene el problema de que no parece contener un ciclo de actualización. Mi forma principal en este momento es una clase de Juego, con el mango lanzado a un objeto Formulario. Necesito usar la actualización y dibujar bucles en esta nueva ventana. – Hoeloe

Respuesta