2010-03-14 5 views
7

Sto creando un editor di mappe per un gioco basato su tessere 2D. Vorrei ospitare due controlli XNA all'interno di Windows Form: il primo a eseguire il rendering della mappa; il secondo per rendere il tileset. Ho utilizzato il codice here per rendere l'host di controllo XNA all'interno di Windows Form. Tutto funziona molto bene, a patto che ci sia solo un controllo XNA all'interno di Windows Form. Ma ho bisogno di due: uno per la mappa; il secondo per il tileset. Come posso eseguire due controlli XNA all'interno di Windows Form? Mentre su Google, ho trovato i termini "swap chain" e "multiple viewport", ma non riesco a capirli e apprezzerei il supporto.[C#] [XNA 3.1] Come posso ospitare due finestre XNA diverse all'interno di un Windows Form?

Proprio come una nota a margine, so che l'esempio di controllo XNA è stato progettato in modo che, anche se è stato eseguito 100 controlli XNA, avrebbero tutti condividono la stessa GraphicsDevice - in sostanza, tutti i 100 controlli XNA avrebbero condiviso lo stesso schermo. Ho provato a modificare il codice per istanziare un nuovo GraphicsDevice per ogni controllo XNA, ma il resto del codice non funziona. Il codice è un po 'lungo da pubblicare, quindi non lo posterò a meno che qualcuno non ne abbia bisogno per essere in grado di aiutarmi.

Grazie in anticipo.

+0

Il collegamento si fa riferimento in questione ** ** fa mostrano come fare quello OP dice che vuole fare. ([Dispositivo grafico WinForms Series 1] (http://xbox.create.msdn.com/en-US/education/catalog/sample/winforms_series_1).) Il codice essenziale è in GraphicsDeviceControl.OnCreateControl: 'graphicsDeviceService = GraphicsDeviceService.AddRef (Gestisci, ClientSize.Width, ClientSize.Height); '. Dopo questo, 'graphicsDeviceService.GraphicsDevice' è il GraphicsDevice che attira quel controllo. Crea due di questi e hai due controlli da disegnare - come mostrato nel codice di esempio. – ToolmakerSteve

+0

... Se non si desidera utilizzare quell'esempio così com'è, tutto ciò che serve è un riferimento a ciascun controllo; metti 'myControl.Handle' nella riga sopra per creare un' GraphicsDeviceService' il cui 'GraphicsDevice' richiama' myControl'. (Se si utilizza ContentManager, si desidera anche la riga successiva, 'services.AddService (graphicsDeviceService);'). – ToolmakerSteve

risposta

6

Ho fatto qualcosa di simile a quello che stai cercando di fare. Tutto quello che devi fare è dire al dispositivo grafico dove presentare la "roba" che hai reso. Lo fai passando un puntatore a una tela.

Ecco una classe modulo di esempio:

public class DisplayForm : Form 
{ 

    IntPtr canvas; 
    Panel displaypanel; 

    public Panel DisplayPanel 
    { 
     get { return displaypanel; } 
     set { displaypanel = value; } 
    } 

    public IntPtr Canvas 
    { 
     get { return canvas; } 
     set { canvas = value; } 
    } 

    public DisplayForm() 
    { 
     displaypanel = new Panel(); 
     displaypanel.Dock = DockStyle.Fill; 

     this.canvas = displaypanel.Handle; 
     this.Controls.Add(displaypanel); 
    } 

} 

Poi basta aggiungere questo al tuo gioco chiamata classe pareggio:

graphics.GraphicsDevice.Present(displayform.Canvas); 

Dopo aver finito il disegno a tale istanza di DisplayForm è possibile cancellare, renderà qualcos'altro, e richiama nuovamente Present che punta a un'altra tela.

+0

Questo metodo funziona se si esegue il rendering in più pannelli sullo stesso modulo? – jjxtra

+2

Sì, sì. Ecco cosa ho creato: http://imgur.com/UCKx8.png – zfedoran

1

Solo un pensiero, ma hai considerato rendendo questa applicazione tuo un'applicazione MDI?

in questo modo è possibile caricare un modulo che contiene 1 istanza di xna più volte.

In mancanza di ciò ... fare quello che suggerisce RodYan :)