DirectX VB.NET - Initialisation - Exception methode Present()

Signaler
Messages postés
2
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
3 avril 2011
-
Messages postés
403
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
7 août 2020
-
Bonjour à tous !

Je suis débutant dans les appli DirectX / VB.NET et j'ai un probleme sur un programme bateau qui affiche un écran vide (et bleu).

L'écran bleu se crée correctement mais quand j'appui sur Echap j'obtiens une exception sur la ligne device.Present()

A first chance exception of type 'Microsoft.DirectX.Direct3D.DeviceLostException' occurred in Microsoft.DirectX.Direct3D.dll


Voici la source de la seule classe du programme :

Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX.Direct3D.D3DX

Class GameClass

    Private displaySettings As DisplayMode
    Private deviceParameters As PresentParameters
    Public device As Device
    Public gameExit As Boolean

    Public Sub Initialize(ByVal fullScreen As Boolean)

        If fullScreen Then
            displaySettings.Width = 800
            displaySettings.Height = 600
            displaySettings.Format = Format.X8R8G8B8
        Else
            displaySettings = Manager.Adapters.Default.CurrentDisplayMode
        End If

        deviceParameters = New PresentParameters()
        deviceParameters.BackBufferWidth = displaySettings.Width
        deviceParameters.BackBufferHeight = displaySettings.Height
        deviceParameters.BackBufferFormat = displaySettings.Format
        deviceParameters.SwapEffect = SwapEffect.Discard
        deviceParameters.PresentationInterval = PresentInterval.Immediate

        If fullScreen Then
            deviceParameters.Windowed = False
        Else
            deviceParameters.Windowed = True
        End If

        loadContent()

    End Sub

    Public Sub loadContent()

        device = New Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, Form1.Handle, CreateFlags.SoftwareVertexProcessing, deviceParameters)

    End Sub

    Public Sub Draw()

        Do While Not gameExit

            device.Clear(ClearFlags.Target, Color.CornFlowerBlue, 1, 0)
            device.BeginScene()
            device.EndScene()
            device.Present() 'C'est ici que ca plante
            Application.DoEvents()
        Loop

        thisExit()

    End Sub

    Public Sub thisExit()
        displaySettings = Nothing
        deviceParameters = Nothing
        device.Dispose()
        device = Nothing
        Application.Exit()
    End Sub

End Class


Voici la source de la seule form :

Public Class Form1
    Dim game As New GameClass

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyCode = Keys.Escape Then 'Close the window when the user presses escape
            Me.Close() 'yes, close, not dispose.
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Show()
        game.Initialize(True)
        game.Draw() 'On est ici quand ca plante
    End Sub

End Class


Auriez vous une idée de la raison de cette erreur ?
Merci beaucoup pour votre aide !

5 réponses


Salut,
Tu as un problème sur ta boucle. Tu dois en sortir avant de tester si le device est présent :
        Do
            If gameExit Then Exit Do
            device.Clear(ClearFlags.Target, Color.CornflowerBlue, 1, 0)
            device.BeginScene()
            device.EndScene()
            device.Present() 'C'est ici que ca plante
            Application.DoEvents()
        Loop

        thisExit()
Messages postés
2
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
3 avril 2011

Merci pour ta réponse banana32 !
Ta boucle est plus élégante. Par contre ca plante toujours au meme endroit et de la meme manière

Salut,
Essaye alors :
      If e.KeyCode = Keys.Escape Then 'Close the window when the user presses escape
            game.thisExit()
        End If

Ou mieux :
If e.KeyCode = Keys.Escape Then 'Close the window when the user presses escape
     game.gameExit = true
End If

Bonne nuit.
Messages postés
403
Date d'inscription
mercredi 19 avril 2006
Statut
Membre
Dernière intervention
7 août 2020
1
Bonjour,

Il arrive

Si le C# ne te fait pas peur et que tu sais convertir cela en vb.net, voici un tuto pas mal en francais pour débuter : http://sites.google.com/site/craigandera/craigs-stuff/directx-home/managed-direct3d-tutorial/translations/managed-direct3d-tutorial-in-french-1

Sinon n'hésites pas à chercher sur le site, il y a pas mal de sources interessante sur le sujet, dont les sources de V3RH :

http://www.vbfrance.com/codes_auteur/VR3H/63682.aspx


Sinon, j'ai lu quelque part que le manage framework de directX n'est plus mis à jour depuis la version 9, donc tu ne pourras pas échapper au C++ si tu veux utiliser les version 10 et 11 de directX.

Le dernier SDK (que j'ai réussi à trouver) date de juin 2010, disponible à cette adresse : http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=3021d52b-514e-41d3-ad02-438a3ba730ba


Bonne Prog