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
Jeu.cpp : InitDevice
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 : Render
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; } }
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...
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); }
Sprite.h
Sprite.cpp
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); };
J'ai beau rentrer le nom du fichier en dur, cela ne marche pas non plus.
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; } [...] }
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
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.
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; [...]
Au cas où voici le reste des classes du système d'animation :
SpriteSheet.h
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)
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; [...] };
Joueur.h
Remplissage de ma SpriteSheet dans le constructeur de Joueur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Joueur { private: SpriteSheet *m_Sprites; [...]
Joueur.cpp
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é...
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)); [...] }
N'hésitez pas à me donner des conseils si vous en avez.
Bonne journée/nuit
Partager