2010-03-14 3 views
7

Je suis en train de créer un éditeur de cartes pour un jeu 2D basé sur des tuiles. Je voudrais héberger deux contrôles XNA à l'intérieur du Windows Form - le premier à rendre la carte; la seconde pour rendre le tileset. J'ai utilisé le code here pour rendre l'hôte de contrôle XNA dans le Windows Form. Tout cela fonctionne très bien - tant qu'il n'y a qu'un seul contrôle XNA dans le Windows Form. Mais j'ai besoin de deux - un pour la carte; la seconde pour le tileset. Comment puis-je exécuter deux contrôles XNA dans le Windows Form? Alors que googling, je suis tombé sur les termes «swap chain» et «multiple viewports», mais je ne peux pas les comprendre et j'apprécierais le soutien. Juste à côté, je sais que l'exemple de contrôle XNA a été conçu de telle sorte que même si vous avez exécuté 100 contrôles XNA, ils partageraient tous le même GraphicsDevice - essentiellement, les 100 contrôles XNA partageraient le même écran. J'ai essayé de modifier le code pour instancier un nouveau GraphicsDevice pour chaque contrôle XNA, mais le reste du code ne fonctionne pas. Le code est un peu long à poster, donc je ne le posterai pas à moins que quelqu'un en ait besoin pour pouvoir m'aider.[C#] [XNA 3.1] Comment puis-je héberger deux fenêtres XNA différentes dans un Windows Form?

Merci d'avance.

+0

Le lien référencé en question ** ** ne montrer comment faire ce que OP dit qu'il veut faire. ([Périphérique graphique WinForms Series 1] (http://xbox.create.msdn.com/en-US/education/catalog/sample/winforms_series_1).) Le code essentiel est dans GraphicsDeviceControl.OnCreateControl: 'graphicsDeviceService = GraphicsDeviceService.AddRef (Handle, ClientSize.Width, ClientSize.Height); Après cela, 'graphicsDeviceService.GraphicsDevice' est le GraphicsDevice qui s'insère dans ce contrôle. Créez deux d'entre eux, et vous avez deux contrôles à dessiner - comme le montre l'exemple de code. – ToolmakerSteve

+0

... Si vous ne voulez pas utiliser cet exemple tel quel, tout ce dont vous avez besoin est une référence à chaque contrôle; mettez 'myControl.Handle' dans la ligne ci-dessus pour créer un' GraphicsDeviceService' dont 'GraphicsDevice' dessine dans' myControl'. (Si vous utilisez ContentManager, vous aurez également besoin de la ligne suivante, 'services.AddService (graphicsDeviceService);'). – ToolmakerSteve

Répondre

6

J'ai fait quelque chose de similaire à ce que vous essayez de faire. Tout ce que vous devez faire est de dire au périphérique graphique où présenter le "truc" que vous avez rendu. Vous faites cela en passant un pointeur sur un canevas.

Voici une classe de formulaire exemple:

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

} 

Ensuite, il suffit d'ajouter ceci à votre classe jeu draw call:

graphics.GraphicsDevice.Present(displayform.Canvas); 

Une fois que vous avez terminé le dessin à cette instance de DisplayForm vous pouvez effacer, restituez quelque chose d'autre, et appelez encore Présent en pointant vers une autre toile.

+0

Cette méthode fonctionne-t-elle si vous effectuez un rendu dans plusieurs panneaux sur le même formulaire? – jjxtra

+2

Oui, c'est le cas. Voici ce que j'ai créé: http://imgur.com/UCKx8.png – zfedoran

2
+0

Il a déjà posté qu'il a utilisé cela ci-dessus. –

+1

C'est la façon de le faire.La première série, IIRC, montre un panneau divisé avec les panneaux gauche et droit contenant un contrôle graphique dérivé de GraphicsDeviceControl (dérivé de contrôle). – IAbstract

+0

-1, avez-vous même lu la question? –

1

Juste une pensée, mais avez-vous pensé faire de cette application de la vôtre une app MDI? Ainsi, vous pouvez charger plusieurs fois un formulaire contenant une instance de xna.

A défaut ... faire ce que suggère RodYan :)