Avatar billede stanglakrids Nybegynder
27. oktober 2005 - 13:25 Der er 2 kommentarer

Opbygning af Managed Direct3D fullscreen app

Er ved at rive håret af mig selv..

Hvordan opbygges et gameloop i en fullscreen-app
med Managed Direct3D og C#, så det tager højde for
DeviceLostExceptions osv.

Har selv konstrueret nedenstående forslag, hvilket
virker udmærket, bortset fra når app'en minimeres
og derefter maksimeres igen. Så kommer der en fejlmedling
med unhandled DeviceLostException..

Synes selv, det burde virke. Men det gør det ikke..
Hvorfor?

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace D3DTest
{
    public class Prog : Form
    {
        Device device;
        PresentParameters presentParams;
        bool deviceLost;
        bool appRunning;

        public void InitGfx()
        {
            presentParams = new PresentParameters();
            presentParams.Windowed = false;
            presentParams.SwapEffect = SwapEffect.Discard;
            presentParams.BackBufferFormat = Manager.Adapters[0].CurrentDisplayMode.Format;
            presentParams.BackBufferWidth = 800;
            presentParams.BackBufferHeight = 600;

            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);

            appRunning = true;
        }

        public void MainLoop()
        {
            while (appRunning)
            {
                Application.DoEvents();

                if (deviceLost)
                {
                    try
                    {
                        device.TestCooperativeLevel();
                    }
                    catch (DeviceLostException)
                    {
                    }
                    catch (DeviceNotResetException)
                    {
                        device.Reset(presentParams);
                        deviceLost = false;
                    }
                    continue;
                }               
               
                device.Clear(ClearFlags.Target, Color.PowderBlue, 1.0f, 0);
                try
                {
                    device.Present();
                }
                catch (DeviceLostException)
                {
                    deviceLost = true;
                }               
            }
        }

        static void Main()
        {
            Prog p = new Prog();
            p.Show();
            p.InitGfx();
            p.MainLoop();
        }

        protected override void OnKeyUp(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
                appRunning = false;
        }
    }   
}
Avatar billede stanglakrids Nybegynder
27. oktober 2005 - 13:38 #1
På forhånd tak :)
Avatar billede stanglakrids Nybegynder
27. oktober 2005 - 17:05 #2
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester