示例#1
0
    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();
        });
    }