private void crash(string reason, Exception ex) { //disable everything try { p_Hotloader.ForceDispose(); p_RenderHeartbeat.ForceStop(); p_LogicHeartbeat.ForceStop(); } catch { } //completely renew the window p_Window.Controls.Clear(); p_Window.UnhookCoreEvents(); p_Window.Click -= handleMouseClick; p_Window.MouseMove -= handleMouseMove; p_Window.MouseUp -= handleMouseUp; p_Window.MouseDown -= handleMouseDown; p_Window.MouseWheel -= handleMouseScroll; p_Window.KeyDown -= handleKeyDown; p_Window.KeyUp -= handleKeyUp; p_Window.Resize -= handleResize; p_Window.GotFocus -= handleFocusChanged; p_Window.LostFocus -= handleFocusChanged; p_Cursor.UnhookEvents(); //save string filename; string repString = crashToFile(ex, null, out filename); //re-enable mouse Cursor.Show(); //any key to exit p_Window.FormClosing += delegate(object sender, FormClosingEventArgs e) { System.Diagnostics.Process.GetCurrentProcess().Kill(); }; p_Window.KeyDown += delegate(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.F3) { p_RenderHeartbeat.Stop(); RichTextBox rtb = new RichTextBox() { ReadOnly = true, Dock = DockStyle.Fill }; rtb.Text = repString; p_Window.Controls.Add(rtb); if (p_Window.IsFullScreen) { p_Window.ToggleFullscreen(); } return; } p_Window.Close(); }; crashAnimateInit(); //fallback on GDI+ renderer //RenderFactory.FailSafe(); //re-initialize renderer since we have left the previous //one in an unknown state. p_Window.RecreateContext(); //hijack rendering p_RenderHeartbeat = new Heartbeat("render"); p_RenderHeartbeat.Speed(4); p_RenderHeartbeat.Start(this, delegate(object st) { Game gm = st as Game; IRenderContext ctx = gm.p_Window.Context; IRenderer renderer = gm.p_Window.Renderer; renderer.BeginFrame(ctx); renderer.SetColor(Color.Black); renderer.Clear(); crashAnimateDraw(ctx, renderer); Font crashFont = new Font("Arial", 70, FontStyle.Bold); IFont font = renderer.SetFont(crashFont); Size crashTxtSize = renderer.MeasureString(":(", font); /*title*/ Rectangle crashBounds = new Rectangle( (ctx.Width / 2) - (crashTxtSize.Width / 2), (ctx.Height / 2) - (crashTxtSize.Height / 2), crashTxtSize.Width, crashTxtSize.Height); renderer.SetBrush(Brushes.White); renderer.DrawString(":(", crashBounds.X, crashBounds.Y); /*reason*/ Font regFont = new Font("Arial", 12, FontStyle.Regular); font = renderer.SetFont(regFont); Size reasonTxtSize = renderer.MeasureString(reason, font); renderer.DrawString( reason, (ctx.Width / 2) - (reasonTxtSize.Width / 2), crashBounds.Y + crashBounds.Height + 20); /*advice*/ string advice = "Press any key to exit or press F3 to view report"; Size adviceTxtSize = renderer.MeasureString(advice, font); renderer.DrawString( advice, (ctx.Width / 2) - (adviceTxtSize.Width / 2), crashBounds.Y + crashBounds.Height + 20 + reasonTxtSize.Height + 5); renderer.EndFrame(); }); }