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

LordTyrael Messages postés 2 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 3 avril 2011 - 3 avril 2011 à 11:16
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020 - 5 avril 2011 à 15:19
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

Utilisateur anonyme
3 avril 2011 à 14:36
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()
0
LordTyrael Messages postés 2 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 3 avril 2011
3 avril 2011 à 17:34
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
0
Utilisateur anonyme
3 avril 2011 à 18:01
Salut,
Essaye alors :
      If e.KeyCode = Keys.Escape Then 'Close the window when the user presses escape
            game.thisExit()
        End If
0
Utilisateur anonyme
3 avril 2011 à 18:16
Ou mieux :
If e.KeyCode = Keys.Escape Then 'Close the window when the user presses escape
     game.gameExit = true
End If

Bonne nuit.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
5 avril 2011 à 15:19
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
0
Rejoignez-nous