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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top