Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I'm trying to put in a new feature into my level editor. Part of the feature is to bring up a form when a user places a new tile onto the map, but once the form is brought up the XNA embedded screen throws up a big red X. I think this is due to the embedded screen losing focus to the form and then crashing.

This is where the form is initialized

 public Form1()
   {
    InitializeComponent();

    //Node Editor

    tileDisplay1.OnInitialize += new EventHandler(tileDisplay1_OnInitialize);
    tileDisplay1.OnDraw += new EventHandler(tileDisplay1_OnDraw);

    Microsoft.Xna.Framework.Input.Keys[] allKeys = (Microsoft.Xna.Framework.Input.Keys[])
     Enum.GetValues(typeof(Microsoft.Xna.Framework.Input.Keys));

    foreach (var key in allKeys)
    KeyboardInput.AddKey(key);

     KeyboardInput.KeyRelease += new KeyHandler(KeyboardInput_KeyRelease);
     MouseInput.MouseMove += new MouseMoveHandler(MouseInput_MouseMove);
     MouseInput.MouseDown += new MouseClickHandler(MouseInput_MouseDown);
     MouseInput.MouseUp += new MouseClickHandler(MouseInput_MouseUp);

     Application.Idle += delegate { tileDisplay1.Invalidate(); };

     saveFileDialog1.Filter = "Map File|*.map";

     Mouse.WindowHandle = tileDisplay1.Handle;

   }

This is where the draw event is fired off

void tileDisplay1_OnDraw(object sender, EventArgs e)
        {
            Logic();
            Render();

            KeyboardInput.Update();
            MouseInput.Update();

            foreach (var actor in Actor.Actors)
                actor.Update();
        }

This is where the form is being called

     private void Logic()
    {
               if (colIndex == 8 && AssociateBox.SelectedIndex == 0)
                {
                    currentCollisionLayer.SetCellIndex(collideCellX, collideCellY,form.spawnNumber.ToString());

                    if(form.spawnNumber == "12")
                    {
                       camdetails.ShowDialog();
                    }
                }
    }
share|improve this question
    
Have you considered simply having a separate form that sits beside the main XNA game window and contains a reference to the game? That's what I did on my map editor. –  Richard Marskell - Drackir Feb 29 '12 at 15:19

2 Answers 2

up vote 2 down vote accepted

The "Big Red X" from the WinForms sample comes up when your draw/update code throws an exception. Rather than simply ignoring it, the WinForms sample catches the exception, switches to displaying the Big Red X, and stops calling your draw/update code.

This is the equivalent of a regular XNA programming exiting with an "Unhandled Exception" error.

Simply resetting the graphics device and attempting to continue is the wrong solution.

What you need to do is figure out where the exception is being thrown, and stop it percolating up past your draw/update code. Try setting "break on exception" in Visual Studio. Or wrap your draw/update code in a try-catch block and adding a breakpoint.

share|improve this answer
    
Thanks, I'II give it a go once I get back –  dbomb101 Mar 1 '12 at 13:27
    
Worked like a charm, thanks man :) –  dbomb101 Mar 1 '12 at 21:26

I recommend reviewing the XNA AppHub sample on WinForms that is located here: http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1

They create a GraphicsDeviceService derived from IGraphicsDeviceService. The GraphicsDeviceService updates PresentationParameters and calls graphicsDevices.Reset(parameters); any time the GraphicsDevice needs it, which is anytime the window or form resizes.

From the code you've posted I'm guessing that camDetails.ShowDialog(); or something inside of SetCellIndex could be the cause.

As a quick test you might try this right before you call Logic();:

graphicsDeviceService.ResetDevice(ClientSize.Width, ClientSize.Height);

Try calling that from your Systems.Windows.Forms.Control

share|improve this answer
    
The camDetails.ShowDialog(); is causing the issue, but I thought the graphics device could be reset when the call to it is made so that the screen doesn't crash or isn't that possible ? –  dbomb101 Feb 29 '12 at 14:28
    
I believe you should be able to create the dialog, reset the device, and then draw. –  Nic Foster Feb 29 '12 at 14:59
    
That should be doable, but the moment dialog is called it doesn't execute the next line and instead throws up the big red X, so I'm guessing it's throwing up an exception the debugger isn't catching –  dbomb101 Feb 29 '12 at 15:13
    
You might try wrapping the statement in a try/catch block to see if you can catch the exception. –  Nic Foster Feb 29 '12 at 15:39
    
My editor is based on this sample and it behaves well in the situations you described. I've never had problems opening new dialogs or switching windows, and I can even have multiple GraphicsDeviceControl objects created and rendering at the same time. I'd recommend starting from there too. –  David Gouveia Mar 1 '12 at 9:28

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.