IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Programme DX3D9


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Par défaut Programme DX3D9
    Bonjour à tous !
    Je suis ici car jai un piti problème pour faire un piti programme avec Direct3D en C++.
    Je suis un grand débutant en la matière et la première chose que j'ai faite a été de me mettre en quète d'un piti tutorial m'expliquant comment commencer. J'ai finalement réussit à un trouver un mais manqu de bol, le chemin qui me conduisait vers la réussite de ce petit jeu fut semé d'embuche :'(. Après avoir réussi au prix de milles périples à trouver un moyen de faire fonctionner DX9 avec Dev-Cpp (ouf !).
    Je me suis trouvé en façe d'une piti bug dans mon programme. Pour l'instant il ne fait rien de bien méchant, il est juste sensé créer une pitite fenêtre de s mettre en mode plein écran et d'afficher un zoli piti fond. Seulement voila, il plante en plein milieu et m'affiche le fameux message d'erreur d'XP.

    Voici mon code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include "windows.h"
    #include <d3d9.h>
    #include <d3dx9.h>
    #include <dxerr9.h>
     
    BOOL Init_D3D (HWND hWnd)
    {
    LPDIRECT3D9 g_objetD3D;
    g_objetD3D = Direct3DCreate9( D3D_SDK_VERSION );
     
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(D3DPRESENT_PARAMETERS) );
    d3dpp.BackBufferWidth = 800;
    d3dpp.BackBufferHeight = 600;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.hDeviceWindow = NULL;
    d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
    d3dpp.Windowed=TRUE;
    d3dpp.FullScreen_RefreshRateInHz=75;
     
    LPDIRECT3DDEVICE9 g_peripherique3D;
     
    HRESULT hr;
     
    hr= g_objetD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_peripherique3D );
     
    LPD3DXSPRITE g_routinesSprites;
    D3DXCreateSprite(g_peripherique3D,&g_routinesSprites);
     
    LPDIRECT3DTEXTURE9 image;
    D3DXCreateTextureFromFile(g_peripherique3D, "fond.bmp", &image);
     
    g_peripherique3D->BeginScene();
    g_peripherique3D->Clear(0, NULL, D3DCLEAR_TARGET, 0x00000000, 0.0, 0);
    g_routinesSprites->Draw(image, NULL, NULL, NULL, 0xFFFFFFFF);
    g_peripherique3D->EndScene();
    g_peripherique3D->Present(NULL, NULL, NULL, NULL);
    }
     
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) 
    {
        switch(message) 
        { 
            case WM_KEYDOWN : 
                 PostQuitMessage(0);
                 break;
     
            case WM_DESTROY : 
                 PostQuitMessage(0); // ici, on intercepte le message de destruction
                 break;
     
            case WM_PAINT : // dessin de la zone client de l'application
            {
                PAINTSTRUCT PaintStruct; 
                HDC PaintDC=BeginPaint( hwnd, &PaintStruct ); 
                EndPaint( hwnd, &PaintStruct );
            }
            break;
        }
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
     
    int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpszCmpParam,int nCmdShow) 
    {
        WNDCLASS W; // structure de classe de fenêtre
        HWND hwnd;
        LPSTR Name = "Ball Of Duty";
        MSG msg;
     
        // remplissage de la structure de classe    
        memset( &W, 0, sizeof(WNDCLASS) );
        W.style = CS_HREDRAW | CS_VREDRAW;
        W.hInstance = hInst;
        W.lpszClassName = Name;
    	W.hbrBackground =(HBRUSH)(COLOR_WINDOW+4);
        W.lpfnWndProc = WndProc; // lien vers la procédure de fenêtre
        RegisterClass( &W ); // enregistrement dans Windows de la structure
     
        // Création de la fenêtre avec toutes les options nécessaires (taille = taille de l'écran)
        hwnd = CreateWindowEx( 0, Name, Name, WS_POPUP, 0, 0, 
    		GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ), 
    		NULL, NULL, hInst, NULL ); 
     
        // Affichage de la fenêtre
        ShowWindow( hwnd, nCmdShow ); 
        UpdateWindow( hwnd );
        Init_D3D(hwnd);
     
    	// On efface le curseur
        ShowCursor( false );
     
        // Boucle d'écoute des messages
        while( GetMessage( &msg, NULL, 0, 0) ) 
        { 
            TranslateMessage( &msg ); 
            DispatchMessage( &msg );
        }
        return msg.wParam; 
    }
    Mine de rien, avant de m'adresser ici j'ai essayé de me renseigner ailleurs. Je suis allé voir certain pote qui n'ont pas pu m'aider, j'ai essayer de trouver d'autres tutoriel, j'ai fouiller la doc du sdk, etc...
    Je pense avoir cerné le problème et il doit se situé entre le BeginScene et le EndScene de ma fonction Init_D3D();
    Donc voila. Si quelqu'un pouvait m'aider, ou même me donner des pistes ou ce genre de chose ... Merci à tous et bonne nuit !!

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    As-tu essayé le debugger, et le debug DirectX ?
    Quelle est ta config ?

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Salut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g_peripherique3D->BeginScene();
    g_peripherique3D->Clear(0, NULL, D3DCLEAR_TARGET, 0x00000000, 0.0, 0);
    g_routinesSprites->Draw(image, NULL, NULL, NULL, 0xFFFFFFFF);
    g_peripherique3D->EndScene();
    g_peripherique3D->Present(NULL, NULL, NULL, NULL);
    Ce code a plutôt sa place dans la procédure windows lors du message WM_PAINT. Regardes les exemples du SDK de directX, tu vas vite comprendre ce qui ne va pas. Une autre méthode est d'utiliser un timer afin de rafraichir l'écran régulièrement, dans le cas ou tu utilises des images non statiques.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Par défaut
    J'ai essayer de debugger. Mais ca m'a fait une adress error à je sais plus qu'elle endroit de la mémoire... Tu veut la config de mon PC ?
    J'ai essayé aussi de chercher dans les exemples et les tutos de DirectX mais je n'a rien trouvé d'intérréssant pour l'instant. Je poursuit mes efforts et j'espère que j'aboutirais à quelques chose. Merci pour vos réponses, j'espère que je vais trouver .

    EDIT : J'ai mis le code au niveau du WM_PAINT, ca fait la même erreur.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Par défaut
    Bon. Le bonne nouvelle c'est que j'ai réussi à corriger le problème. Pour cela jai remplacé le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    d3dpp.BackBufferWidth = 800;
    d3dpp.BackBufferHeight = 600;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.hDeviceWindow = NULL;
    d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
    d3dpp.Windowed=TRUE;
    d3dpp.FullScreen_RefreshRateInHz=75;
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    D3DDISPLAYMODE displayMode;
    	g_objetD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode);
    	d3dpp.BackBufferWidth = displayMode.Width;
    	d3dpp.BackBufferHeight = displayMode.Height;
    	d3dpp.BackBufferFormat = displayMode.Format;
    	d3dpp.BackBufferCount = 1;
    	d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	d3dpp.hDeviceWindow = NULL;
    	d3dpp.Windowed = TRUE;
    	d3dpp.EnableAutoDepthStencil = TRUE;
    	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    	d3dpp.Flags = 0;
    	d3dpp.FullScreen_RefreshRateInHz = 0;
    	d3dpp.PresentationInterval = 0;
    Le résultat ? Un écran noir. Le prgm marche. Il y a juste qu'il n'affiche pas l'image. Je vais essayer de faire pour qu'il l'affiche dans le WM_PAINT.


    EDIT : Après recherche je me suis aperçu que c'était cette ligne qui ne marchait pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d3dpp.FullScreen_RefreshRateInHz = 75;

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Un petit tour du côté du SDK de directX ne te fera pas de mal. Il y a la documentation qui t'explique par exemple le détail de la structure D3DPRESENT_PARAMETERS. tu peux y lire:

    FullScreen_RefreshRateInHz

    The rate at which the display adapter refreshes the screen. The value depends on the mode in which the application is running:

    For windowed mode, the refresh rate must be 0.

    For full-screen mode, the refresh rate is one of the refresh rates returned by IDirect3D9::EnumAdapterModes.
    Malheureusement les tutoriaux n'expliquent pas ce genre de chose. D'autant que la plupart n'utilisent pas le mode plein écran mais le mode fenêtré. Donc avec une valeur par défaut à zéro.

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    J'ai un peu regardé cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g_routinesSprites->Begin(D3DXSPRITE_ALPHABLEND);
    g_routinesSprites->Draw(image, NULL, NULL, NULL, 0x00000000);
    g_routinesSprites->End();
    Elle doit être entourée par ces deux méthodes. Mais ça ne veut pas dire que ça va marcher... (il y d'autres paramètres à respecter dans l'initialisation du device).

    Attention car dans le nouveau code que tu viens de donner, tu mélanges mode fullscreen et mode fenêtré!


  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    J'ai essayer de debugger. Mais ca m'a fait une adress error à je sais plus qu'elle endroit de la mémoire...
    Je parlais de récupérer la ligne qui cause le plantage, la valeur des variables à ce moment, la pile d'appels, etc...
    Je parlais aussi d'activer le debug runtime de DirectX et de voir ce qui s'affiche dans ta console debug.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Par défaut
    Citation Envoyé par Loulou24
    J'ai essayer de debugger. Mais ca m'a fait une adress error à je sais plus qu'elle endroit de la mémoire...
    Je parlais de récupérer la ligne qui cause le plantage, la valeur des variables à ce moment, la pile d'appels, etc...
    Je parlais aussi d'activer le debug runtime de DirectX et de voir ce qui s'affiche dans ta console debug.
    Dsl mis je ne sait pas très bien faire, je suis encore un grand débutant....

    Sinon ca marche perfect une fois que j'ai rajouté les Begin et les Ends. L'exemple dont je me servait ne les mettait pas mais je me suis aperçu qu'il ne dessinait que des primitives et comme je croyais que c'était le même principe j'ai foncé tête bassé. Mais maintenant tout marche grace à vous !! Merci encore à tous ! Et bon week-end !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo