2012-10-06 9 views
6

Ok, quindi eccoci qui. Sto tentando di creare un'applicazione, usando XNA come base a causa del suo renderer. Una delle cose necessarie in questo progetto è di aprire una nuova finestra (come una finestra di dialogo), in cui è incorporato un pannello di rendering XNA separato. Sto usando questo come pannello di anteprima interattivo, quindi ho assolutamente bisogno di XNA per renderizzare lì. Tuttavia, sembra che XNA non sia molto ben equipaggiato per farlo. Ho provato varie cose da me, ma senza successo (producendo errori e non rendendoli correttamente, o mostrando le proporzioni sbagliate, ecc.). Normalmente, avrei inserito il codice qui, ma dal momento che ho avuto tanta fortuna, non c'è molto da pubblicare.XNA con Windows Forms - Apre una nuova finestra

La mia applicazione attualmente consiste in un'applicazione XNA incorporata in un modulo e ho un pulsante per aprire il pannello di anteprima, che in teoria dovrebbe apparire come una finestra di dialogo modulo, contenente il renderer XNA, per permettermi di disegnare il anteprima. Ho provato questo per diverse ore, e non ho ottenuto nulla, quindi sto chiedendo un po 'di aiuto qui.

Grazie, comunque.

EDIT: Ok, ho fatto un piccolo progresso, ma ho 2 problemi. Innanzitutto, tutte le trame disegnate con un batch di sprite appaiono delle dimensioni corrette, ma riempite con un nero solido. Inoltre, quando apro la finestra di dialogo, quindi la chiudo e chiudo l'applicazione, viene visualizzata un'eccezione AccessViolationException. Sospetto fortemente che i due errori siano collegati in qualche modo.

Ecco il mio codice inizializzando la finestra di anteprima. (a è una classe personalizzata che consiste essenzialmente in una lista collegata di oggetti Texture2D).

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

La mia classe AnimationPreview è un'estensione della classe Form, e contiene un oggetto PreviewControl, che è un'estensione del GraphicsDeviceControl trovato nel campione XNA Winforms. Nota che il mio modulo principale estende la classe XNA Game, per vari motivi.

oggetto

Il PreviewControl è impostato in questo modo:

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

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

Questo cancella lo sfondo del modulo viola, come previsto, e disegna una scatola nera della stessa dimensione di Immagine. Questo non è previsto. Spero che qualcuno possa aiutarmi qui.

NOTA: un'alternativa accettabile sarebbe quella di convertire gli oggetti XNA Texture2D in oggetti System.Drawing.Image. Tuttavia, sto usando XNA 3.1, quindi non posso semplicemente salvare la texture in un flusso e ricaricarla. In realtà, dopo aver provato questo, è un po 'dubbia e molto lento, quindi preferirei non farlo in questo modo.

+2

Si sta utilizzando [l'esempio XNA WinForms] (http://xbox.create.msdn.com/en-US/sample/winforms_series1)? (Perché, in caso contrario, sarebbe il punto 1). –

+0

No, darò un'occhiata. – Hoeloe

+0

Hmm ...sembra essere quasi quello che sto cercando, ma ha il problema che non sembra contenere un ciclo di aggiornamento. La mia forma principale al momento è una classe di gioco, con il cast del manico su un oggetto Form. Devo usare l'aggiornamento e disegnare i loop in questa nuova finestra. – Hoeloe

risposta