Como armazenar um vetor de objetos LPD3DXSPRITE?
Pergunta
Vamos dizer que eu quero armazenar um vetor de LPD3DXSPRITE objetos. A linha para declarar este código seria std::vector<LPD3DXSPRITE> sprites;
I deve ser capaz de criar o meu sprite com:
LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);
Finalmente, eu deveria ser capaz de adicionar este para o vector assim:
sprites.push_back(sprite);
Pelo menos com o meu entendimento, que deve ser plausível. No entanto, este compila mas dá erros de execução. Por que é isso? Eu vou sobre isso errado? Como eu poderia corrigir isso?
Editar:
Isto pode ser útil também. yields a chamada pilha para esta função que vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38
é o que é chamado. Este não é o vector que foi aprovada.
No entanto, LPD3DXSPRITE é apenas um typedef para ID3DXSprite. * Isso poderia trazer nada à luz?
Solução
Depois de olhar através de seu código, eu encontrei o problema. Algo para olhar quando você começa qualquer quebra na sua aplicação é a guia "Autos" ou na guia Locals. Aqui você vai notar algo sobre o ponteiro this
: É nula
Isso significa que a instância que AddSprite
está sendo chamado não existe. Esta é a sua SpriteManager
, o que eu vejo é um singleton. Em seu principal, você não cria uma instância dela.
Eu tive que fazer algumas coisas para fazê-lo funcionar. Eu incluí "LudoRenderer/SpriteManager.h"
em Main.cpp
, e acrescentou a chamada CreateInstance
:
SpriteManager::CreateInstance();
O único problema com isso é que você havia declarado seu construtor / destruidor privado, como outros singletons, mas nunca definiu-los, então eu fiz isso também:
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){}
Após essas mudanças, ele "trabalhou". Que está em aspas porque seu problema está resolvido, mas há um outro erro no final do m_GameManager->SetWagon(m_Wagon);
código.
Aqui, m_GameManager
não é inicializado. I m_GameManager = GameManager::GetInstance();
descomentada na linha 43 em LudoEngine.cpp
, que nos colocou no mesmo problema de antes, não CreateInstance
nunca é chamado. Eu adicionei o cabeçalho necessário principal, chamado de método de criar. Isso resolveu o problema, e seu correu motor (arrefecer demo, também!)
Houve um acidente na saída, em ErrorLogger::LogError
, porque ErrorLogger
foi nula. Ele estava sendo chamado de destruidor de LudoMemory
, mas vou deixar isso para você. :)
Agora, duas dicas que eu tihnk que iria ajudar. A primeira é sobre a questão que está resolvendo. Normalmente, singletons irá criar-se se eles já não estão. Eu mudaria a sua GetInstance
singleton para algo como isto:
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
}
return m_Singleton; // not sure what the cast was for
}
Isto irá forçar criação do singleton se não tiver já sido. Agora, se você quiser que os usuários CreateInstance
chamada antes de tentar GetInstance
, você pode adicionar algum tipo de aviso:
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
std::cerr << "Warning, late creation of singleton!" << std::endl;
// or perhaps:
ErrorLogger::GetInstance()->
LogError(L"Warning, late creation of singleton!");
}
return m_Singleton;
}
Uma vez que deixa de fora a informação importante "qual o singleton", você poderia sempre tentar adicionar typeinfo a ele:
#include <typeinfo>
// ...
std::cerr << "Warning, late creation of singleton: "
<< typeid(T).name() << std::endl;
Para tentar obter alguns nomes de tipos lá dentro.
E por último, não há problema em delete 0
, sua macro de exclusão verificada não é necessário.
Para esclarecer, você tem LUDO_SAFE_DELETE
, que verifica se não é nulo antes de ele chama de exclusão. Em C ++, apagando nulo não tem nenhum efeito, para que o seu cheque não é necessário. Todas as instâncias do seu seguro de exclusão poderia ser substituído com apenas seu LUDO_DELETE.
Outras dicas
O código parece ok para mim. Mas você está armazenando um ponteiro para ID3DXSprite no vetor. Como é que esta de-alocada? É possível o sprite tem sido de-alocados de modo que as extremidades do vetor se segurando um ponteiro inválido e, em seguida, as tentativas para referenciar o ponteiro?