Cómo almacenar un vector de LPD3DXSPRITE objetos?
Pregunta
Digamos que yo quiero para almacenar un vector de LPD3DXSPRITE objetos.La línea a declarar este código sería std::vector<LPD3DXSPRITE> sprites;
Yo debería ser capaz de crear mi sprite con:
LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);
Por último, debo ser capaz de agregar a este vector como:
sprites.push_back(sprite);
Al menos con mi entendimiento, que debe ser plausible.Sin embargo, este compila, pero da errores de tiempo de ejecución.¿Por qué es esto?Estoy haciendo mal?¿Cómo podría solucionarlo?
editar:
Esto puede ser útil también.La pila de llamadas de los rendimientos para esta función que vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38
es lo que se llama.Este no es el vector que fue aprobada.
Sin embargo, LPD3DXSPRITE es sólo un typedef para ID3DXSprite *.Este podría traer nada a la luz?
Solución
Después de mirar a través de su código, he encontrado el problema.Algo a tener en cuenta al obtener pausas en su aplicación es la "Autos" de la pestaña o ficha Locales.Aquí te darás cuenta de algo acerca de la this
puntero:es nulo!
Eso significa que la instancia que AddSprite
se llama en realidad no existe.Esta es tu SpriteManager
, que veo que es un singleton.En el principal, no se crea una instancia de la misma.
Tuve que hacer un par de cosas para que funcione.He incluido "LudoRenderer/SpriteManager.h"
en Main.cpp
, y añadimos el CreateInstance
llame al:
SpriteManager::CreateInstance();
El único problema con esto era que había declarado su constructor/destructor privado, como en otros embarazos únicos, pero nunca se define ellos, así que lo hice así:
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){}
Después de los cambios, que "trabaja".Eso es entre comillas porque el problema está solucionado, pero hay otro error más adelante en el código m_GameManager->SetWagon(m_Wagon);
.
Aquí, m_GameManager
no está inicializado.Yo sin comentar m_GameManager = GameManager::GetInstance();
en la línea 43 LudoEngine.cpp
, lo que nos puso en el mismo problema que antes, no CreateInstance
nunca se llama.He añadido el encabezado necesario en el principal, llamado el método de crear.Esto solucionó el problema, y su motor ran (fresco demo, también!)
Hubo un accidente en la salida, en ErrorLogger::LogError
, porque ErrorLogger
era nula.Estaba siendo llamado en LudoMemory
's destructor, pero voy a dejar esto para usted.:)
Ahora, dos consejos que me tihnk de ayuda.La primera es sobre el problema que estamos resolviendo.Normalmente, los únicos creará a sí mismos, si no están ya.Me gustaría cambiar su singleton GetInstance
a algo como esto:
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
}
return m_Singleton; // not sure what the cast was for
}
Esto obligará a la creación de la singleton, si no ha sido ya.Ahora, si quieres que los demás usuarios de la llamada CreateInstance
antes de intentar GetInstance
, puede añadir algún tipo de advertencia:
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;
}
Desde que sale de la importancia de la información ", que singleton?", siempre se puede intentar agregar typeinfo a ella:
#include <typeinfo>
// ...
std::cerr << "Warning, late creation of singleton: "
<< typeid(T).name() << std::endl;
Para tratar de obtener algún tipo de nombres en allí.
Y por último, está bien delete 0
, sus comprueba delete macro no es necesario.
Para aclarar, usted tiene LUDO_SAFE_DELETE
, la cual se verifica si no es null antes de que llame a eliminar.En C++, la eliminación de null no tiene ningún efecto, por lo que su cheque no es necesario.Todas las instancias de su seguro de eliminar podría ser reemplazado con su LUDO_DELETE.
Otros consejos
El código me parece bien. Pero está almacenando un puntero a ID3DXSprite en el vector. ¿Cómo se desasigna esto? ¿Es posible que el sprite se haya desasignado para que el vector termine sosteniendo un puntero no válido y luego intente hacer referencia al puntero?