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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top