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 :

[DX11] Affichage de sprite


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [DX11] Affichage de sprite
    Bonjour,

    Je tente actuellement de réaliser un petit jeu 2D avec DX11 et DirectX Toolkit.

    Si je tente de créer une texture/sprite dans le code "de base" en procédant de la sorte, tout marche bien :

    Jeu.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Jeu
    {
        [...]
        private:
             ID3D11ShaderResourceView*           g_pTextureRV = nullptr;
        [...]
    }
    Jeu.cpp : InitDevice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    HRESULT Jeu::InitDevice()
    {
            [...]
            g_Sprites.reset(new SpriteBatch(g_pImmediateContext));
    	g_Font.reset(new SpriteFont(g_pd3dDevice, L"italic.spritefont"));
    	hr = CreateDDSTextureFromFile(g_pd3dDevice, L"FILE_NAME.dds", nullptr, &g_pTextureRV);
     
    	if (FAILED(hr))
    	{
    		return hr;
    	}
    }
    Jeu.cpp : Render
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Jeu::Render()
    {
    	g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, Colors::MidnightBlue);
    	g_pImmediateContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
     
    	CommonStates states(g_pd3dDevice);
    	g_Sprites->Begin(SpriteSortMode_Deferred, states.NonPremultiplied());
    	g_Sprites->Draw(g_pTextureRV, XMFLOAT2(100, 100), nullptr, Colors::White);
    	g_Font->DrawString(g_Sprites.get(), L"DirectXTK Simple Sample", XMFLOAT2(100, 10), Colors::Yellow);
    	g_Sprites->End();
     
    	g_pSwapChain->Present(0, 0);
    }
    En revanche, lorsque j'essaye de créer les textures/sprites via mes classes de gestion d'animation, là la pagaille commence ! Mon ID3D11ShaderResourceView est toujours à null et j'ai beau utiliser exactement ce qui marche dans le cas précédent, rien à faire...

    Sprite.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Sprite
    {
    	private:
    		ID3D11ShaderResourceView*	m_pSprite;
    		RECT*						m_Frame;
    		bool m_Loop;
    		int m_NbFrame;
    		[...]
    	public:
    		Sprite(const wchar_t *_File, bool _Loop, int _NbFrames);
    		~Sprite();
                    [...]
    		void Draw(int _Index, XMFLOAT2 _Position, bool _Flip);
    };
    Sprite.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sprite::Sprite(const wchar_t *_File, bool _Loop, int _NbFrames)
    {
    	HRESULT hr = S_OK;
    	hr  = CreateDDSTextureFromFile(g_pd3dDevice, _File, nullptr, &m_pSprite); // PROBLEME ! g_pd3dDevice vaut null de ce fait m_pSprite vaudra toujours null !
    	if (FAILED(hr))
    	{
    		return;
    	}
            [...]
    }
    J'ai beau rentrer le nom du fichier en dur, cela ne marche pas non plus.
    edit : En faisant du pas à pas avec le debuggueur Cela vient du fait que g_pd3dDevice est null également...
    Voici le fichier où je le déclare :
    VariablesGlobales.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [...]
    #include "DDSTextureLoader.h"
    #include "SpriteBatch.h"
     
    using namespace DirectX;
     
    static ID3D11Device*                       g_pd3dDevice;
    static std::unique_ptr<SpriteBatch>        g_Sprites;
    [...]
    Pourtant entre mon test dans Game.cpp et ma création du Joueur il n'y a aucun morceau de code qui les sépare... Si jamais vous avez une idée d'où pourrait venir mon g_pd3dDevice à null.

    Au cas où voici le reste des classes du système d'animation :
    SpriteSheet.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class SpriteSheet
    {
    	private:
    		std::map<std::string, Sprite*> m_Sprites;
    		std::string m_CurrentSpriteKey;
    		int m_Index;
    		bool m_Flip;
            [...]
     
    };
    Pour le moment mon joueur est un variable globale défini dans Jeu.h : static Joueur* g_Joueur; (je n'ai pas trouvé mieux pour gérer les inputs avec le Callback pour le moment, apparemment DirectX peut gérer les Input, il faudra que je me renseigne)
    Joueur.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Joueur
    {
    	private:
    		SpriteSheet *m_Sprites;
           [...]
    Remplissage de ma SpriteSheet dans le constructeur de Joueur :

    Joueur.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Joueur::Joueur()
    {
            m_Sprites = new AnimationSheet();
    	m_Sprites->AddSprite((std::string)"TITLE_SPRITE", new Sprite(L"FILENAME.dds", true, 4));
            [...]
    }
    Merci d'avance pour votre aide ! Je commence à m'arracher les cheveux, surtout que ce n'est pas vraiment ce qu'il y a de plus compliqué...

    N'hésitez pas à me donner des conseils si vous en avez.

    Bonne journée/nuit

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hr  = CreateDDSTextureFromFile(g_pd3dDevice, _File, nullptr, &m_pSprite); // PROBLEME ! g_pd3dDevice vaut null de ce fait m_pSprite vaudra toujours null
    D'où vient g_pd3dDevice ?
    Il semble que ce soit une variable globale et comme on le dit souvent : les variables globales sont à bannir.

    Notamment, la variable est surement initialisée après son utilisation, c'est pour ça qu'elle est NULL. C'est le problème des variables globales, il faut s'assurer de leur initialisation avant utilisation et aussi, s'assurer que cela s'initialise bien dans l'ordre que l'on souhaite.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour, merci pour ta réponse.

    Effectivement il s'agit d'une variable globale, je vais essayer de revoir mon design pour ne plus en avoir besoin.

    Cependant concernant l'utilisation de g_pd3dDevice il me semble bien qu'elle est initialisée avant d'être utilisée.

    Constructeur de Jeu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_pd3dDevice = nullptr;
    Initialisation de jeu:
    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
     
    {
            [...]
    	hr = D3D11CreateDeviceAndSwapChain(nullptr, g_driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels,
    			D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext);
     
            [...]
     
    	hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_pRenderTargetView);
     
           [...]
     
           hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencil);
     
           [...]
     
           hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencil, &descDSV, &g_pDepthStencilView);
     
          // Création de l'image.
          // Cas qui marche : hr = CreateDDSTextureFromFile(g_pd3dDevice, L"FILE_NAME.dds", nullptr, &g_pTextureRV);
          //Marche pas : _Joueur = new Joueur()
          // Cas qui marche : _Joueur = new Joueur(g_pd3dDevice);
    }
    Fonction pour le rendu
    {
    [...]
    CommonStates states(g_pd3dDevice);
    [...]
    }

    A la base dans mon cas où "ça marche", je créais l'image directement dans la fonction d'initialisation. En encapsulant l'image dans un objet cela ne marchait plus. J'ai "résolu" mon problème en passant par référence g_pd3dDevice dans mes fonctions. Ça compile mais je me doute que ce n'est pas très propre.

    Si quelqu'un a une piste/explication pour la soudaine mise à null du pointeur, je suis curieux de savoir.

    Note au modérateur : J'attends quelques jours pour d'éventuels éclaircissements puis je passerais le bug en résolu, même s'il a plutôt été détourné que résolu.

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Khazzul Voir le message
    Si quelqu'un a une piste/explication pour la soudaine mise à null du pointeur, je suis curieux de savoir.
    C'est probablement difficile à dire sans plus d'information.

    Soit le pointeur a toujours été NULL, soit le pointeur était non NULL à un moment et a été réécrit par ton programme quelque part d'autre (ou alors ta variable est dédoublée et tu fais référence à deux cases mémoires différentes).

    Le truc c'est que tu peux lancer ton débogueur préféré (Visual Studio j'imagine ?), tu mets un breakpoint à un point où tu sais que ton pointeur est non NULL, puis tu mets un break on access sur l'addresse de la variable pour voir quand est-ce qu'il est à nouveau modifié.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

Discussions similaires

  1. Affichage de sprites
    Par Mokona dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/12/2010, 14h51
  2. [Swing] Affichage de sprites
    Par wishmerhill dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/08/2008, 14h13
  3. Probleme d'affichage de sprites
    Par drcd dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/05/2006, 19h38
  4. Double buffering : affichage de sprite
    Par sorry60 dans le forum SDL
    Réponses: 6
    Dernier message: 02/02/2006, 15h43
  5. Tri à bulle - Affichage de sprite
    Par Gory dans le forum Assembleur
    Réponses: 5
    Dernier message: 10/03/2005, 15h27

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