Okey so I made some code to store and retrieve my loaded textures when needed however it seems to be causing some strange problem.. If anyone can help me figure out what's going on I'd be deeply grateful.
No errors show up on the build log but an error window pops up and tells me there has been an unhandled exception on win32..
The sprite class that holds the texture
class Sprite
{
private:
LPDIRECT3DTEXTURE9 texture;
public:
Sprite();
LPDIRECT3DTEXTURE9 get_texture()const;
};
Sprite::Sprite()
{
texture = NULL;
}
LPDIRECT3DTEXTURE9 Sprite::get_texture() const
{
return texture;
}
The resource manager class that stores pointers to sprite class instances(the loaded sprites)
class ResourceManager
{
private:
std::map<std::string, Sprite *> sprite_map;
public:
Sprite* retrieve_sprite(std::string name);
void store_sprite (Sprite* sprite, std::string name);
};
Sprite* ResourceManager::retrieve_sprite(std::string name)
{
Sprite *sprite = sprite_map[name];
if(sprite != 0)
return sprite;
return NULL;
}
void ResourceManager::store_sprite (Sprite* sprite, std::string name)
{
sprite_map[name] = sprite;
}
the sprite instance class, an instance of this class is assigned to each created object to determine the sprite it uses and that sprite's current properties(frame, time since last frame was displayed etc..)
struct SpriteInstance
{
Sprite *sprite;
int row, column;
DWORD last_frame;
SpriteInstance();
SpriteInstance(Sprite*);
};
SpriteInstance::SpriteInstance()
:
sprite(NULL),
row(0),
column(0),
last_frame(0)
{}
SpriteInstance::SpriteInstance(Sprite *new_sprite)
:
sprite(new_sprite),
row(0),
column(0),
last_frame(0)
{}
The render function, it takes a vector of the game objects and passes them one by one to the draw function.
void render(Direct3D direct3d,
std::vector<Object>* game_objects)
{
direct3d.start_render();
Object object;
std::vector<Object>::iterator it = game_objects->begin();
for( ; it != game_objects->end(); it++)
{
object = *it;
direct3d.draw_sprite(&object);
}
direct3d.end_render();
}
the load function, this one calls the load_sprite function on the direct3d object(from the application object) also creates a sprite object and stores a pointer to it in the map of the resource manager.
void Application::load_sprite(Direct3D direct3d,
std::string sprite_name,
LPCSTR file_name)
{
Sprite sprite;
direct3d.load_sprite(&sprite, file_name);
resource_manager.store_sprite(&sprite, sprite_name);
}
The direct3d load_sprite function
void Direct3D::load_sprite(Sprite *sprite,
LPCTSTR file_name)
{
LPDIRECT3DTEXTURE9 texture = sprite->get_texture();
D3DXCreateTextureFromFileEx(d3d_device,
file_name,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
NULL,
D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DCOLOR_XRGB(255, 0, 255),
NULL,
NULL,
&texture);
}
Finally the draw_sprite function where I think the problem is. I commented out the irrelevant lines.
void Direct3D::draw_sprite(Object *object)
{
SpriteInstance sprite_instance = object->get_sprite_instance();
LPDIRECT3DTEXTURE9 texture = sprite_instance.sprite->get_texture();
// D3DXVECTOR2 scaling = get_scaling();
// D3DXVECTOR2 center = get_center();
// float rotation = object->degrees_to_radians(object->get_rotation());
// D3DXVECTOR2 position = object->get_position();
// int size = get_size();
// RECT frame = get_frame(&sprite_instance, size);
D3DXMATRIX mat;
D3DXMatrixTransformation2D(&mat,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
d3d_sprite->SetTransform(&mat);
d3d_sprite->Draw(texture, NULL, NULL, NULL, 0xFFFFFFFF);
}
[Edited by - Antonym on December 24, 2008 10:28:02 AM]