[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:
1 2 3 4 5 6 7
| class Jeu
{
[...]
private:
ID3D11ShaderResourceView* g_pTextureRV = nullptr;
[...]
} |
Jeu.cpp : InitDevice
Code:
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:
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:
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:
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:
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:
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:
1 2 3 4 5
| class Joueur
{
private:
SpriteSheet *m_Sprites;
[...] |
Remplissage de ma SpriteSheet dans le constructeur de Joueur :
Joueur.cpp
Code:
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 :)