Original Post
Okay so i have been working on a very simple game engine in order to ease my development on games. So far it has been going well, until I discovered a bug. I have a texture manager that can create or add textures to a vector that contains all of the texture objects. It works perfectly when I only add 1 texture to the game, but when i try to add multiple textures the game window pops up and disappears which leads me to believe something is either wrong in my Texture class or my TextureManager Draw function or it's AddTexture function. I have been stuck on this for days, and would really appreciate some help. I have attached the code so you could possibly take a peek.
Thanks for Your Help.
PS. I am 14 so i might have made some stupid mistakes.
Code: (Just the Texture and TextureManager header/source files, everything else works fine)
[source lang="cpp"]namespace Smitty
{
class cTexture
{
public:
cTexture();
cTexture(string filename, string Name);
~cTexture();
int GetX();
int GetY();
int GetW();
int GetH();
void SetX(int x);
void SetY(int y);
string GetFilename();
void SetFilename(string name);
string GetName();
void SetName(string Name);
SDL_Surface* GetTexture();
SDL_Surface *texture;
void DrawTexture(SDL_Surface *Surface, int x, int y);
void DrawTextureSection(SDL_Surface *Surface, SDL_Rect *rect, int x, int y);
private:
int Width;
int Height;
int X,Y;
string Filename;
string name;
};
}[/source]
(This is just the Draw Texture function
)
void cTexture::DrawTexture(SDL_Surface *Surface, int x, int y)
{
SDL_Rect dest;
dest.x = x;
dest.y = y;
dest.w = Width;
dest.h = Height;
SDL_BlitSurface(texture,NULL,Surface, &dest);
}
Alright so here is the TextureManager Class
[source lang="cpp"]namespace Smitty
{
class cTextureManager
{
public:
cTextureManager();
~cTextureManager();
SDL_Surface *LoadTexture(string filename);
void ReloadAllTextures();
void CreateTexture(string filename, string texName); //Creates a new texture and adds it to the Textures vector
void AddTexture(cTexture &texture);
void FreeTexture(string texName);
void FreeAllTextures();
void DrawTexture(string texName, SDL_Surface *Destination, int x, int y); //Draws one texture
void DrawTexture(string texName, SDL_Surface *Destination);
void DrawAllTextures(SDL_Surface *Destination); //Draws all textures
int GetTextureWidth(cTexture texName);
int GetTextureHeight(cTexture texName);
int GetTextureX(string texName);
int GetTextureY(string texName);
void SetTextureX(string texName, int value);
void SetTextureY(string texName, int value);
void GetSize();
protected:
vector Textures;
};[/source]
Now here are the problematic functions in the TextureManager class
[source lang="cpp"]
SDL_Surface *cTextureManager::LoadTexture(string filename)
{
SDL_Surface *temp = NULL;
SDL_Surface *optimized = NULL;
temp = SDL_LoadBMP(filename.c_str());
if(temp != NULL)
{
optimized = SDL_DisplayFormat( temp );
SDL_FreeSurface( temp );
cout << "Optimized Image Created." << endl;
}
return optimized;
}
//Creates a new cTexture and adds it to the Textures vector
void cTextureManager::CreateTexture(string filename, string texName)
{
cTexture temp;
temp.SetFilename(filename.c_str());
temp.SetName(texName);
AddTexture(temp);
cout << "Texture Added." << endl;
}
//Adds a already instiated cTexture to the Textures vector
void cTextureManager::AddTexture(cTexture &texture)
{
// CreateTexture(texture.GetFilename(), texture.GetName());
string filename;
string name;
filename = texture.GetFilename();
name = texture.GetName();
texture.texture = LoadTexture(filename.c_str());
texture.SetName(name.c_str());
Textures.push_back(texture);
cout << "Texture Added." << endl;
}[/source]
//Draws a texture at user specified coordinates
void cTextureManager::DrawTexture(string texName, SDL_Surface *Destination, int x, int y)
{
vector::iterator it;
for(it = Textures.begin(); it < Textures.end(); it++)
{
if(it->GetName() == texName)
it->DrawTexture(Destination,x,y);
}
}
//Draws texture at textures coordinates instead of user specified cords.
void cTextureManager::DrawTexture(string texName, SDL_Surface *Destination)
{
vector::iterator it;
for(it = Textures.begin(); it < Textures.end(); it++)
{
if(it->GetName() == texName)
it->DrawTexture(Destination,it->GetX(),it->GetY());
}
}
//Draws all textures at thier coordinates
void cTextureManager::DrawAllTextures(SDL_Surface *Destination)
{
vector::iterator it;
for(it = Textures.begin(); it < Textures.end(); it++)
{
it->DrawTexture(Destination,it->GetX(),it->GetY());
}
}[/source]
Thanks for Your Help.
PS. I am 14 so i might have made some stupid mistakes.
Code: (Just the Texture and TextureManager header/source files, everything else works fine)
[source lang="cpp"]namespace Smitty
{
class cTexture
{
public:
cTexture();
cTexture(string filename, string Name);
~cTexture();
int GetX();
int GetY();
int GetW();
int GetH();
void SetX(int x);
void SetY(int y);
string GetFilename();
void SetFilename(string name);
string GetName();
void SetName(string Name);
SDL_Surface* GetTexture();
SDL_Surface *texture;
void DrawTexture(SDL_Surface *Surface, int x, int y);
void DrawTextureSection(SDL_Surface *Surface, SDL_Rect *rect, int x, int y);
private:
int Width;
int Height;
int X,Y;
string Filename;
string name;
};
}[/source]
(This is just the Draw Texture function
void cTexture::DrawTexture(SDL_Surface *Surface, int x, int y)
{
SDL_Rect dest;
dest.x = x;
dest.y = y;
dest.w = Width;
dest.h = Height;
SDL_BlitSurface(texture,NULL,Surface, &dest);
}
Alright so here is the TextureManager Class
[source lang="cpp"]namespace Smitty
{
class cTextureManager
{
public:
cTextureManager();
~cTextureManager();
SDL_Surface *LoadTexture(string filename);
void ReloadAllTextures();
void CreateTexture(string filename, string texName); //Creates a new texture and adds it to the Textures vector
void AddTexture(cTexture &texture);
void FreeTexture(string texName);
void FreeAllTextures();
void DrawTexture(string texName, SDL_Surface *Destination, int x, int y); //Draws one texture
void DrawTexture(string texName, SDL_Surface *Destination);
void DrawAllTextures(SDL_Surface *Destination); //Draws all textures
int GetTextureWidth(cTexture texName);
int GetTextureHeight(cTexture texName);
int GetTextureX(string texName);
int GetTextureY(string texName);
void SetTextureX(string texName, int value);
void SetTextureY(string texName, int value);
void GetSize();
protected:
vector
};[/source]
Now here are the problematic functions in the TextureManager class
[source lang="cpp"]
SDL_Surface *cTextureManager::LoadTexture(string filename)
{
SDL_Surface *temp = NULL;
SDL_Surface *optimized = NULL;
temp = SDL_LoadBMP(filename.c_str());
if(temp != NULL)
{
optimized = SDL_DisplayFormat( temp );
SDL_FreeSurface( temp );
cout << "Optimized Image Created." << endl;
}
return optimized;
}
//Creates a new cTexture and adds it to the Textures vector
void cTextureManager::CreateTexture(string filename, string texName)
{
cTexture temp;
temp.SetFilename(filename.c_str());
temp.SetName(texName);
AddTexture(temp);
cout << "Texture Added." << endl;
}
//Adds a already instiated cTexture to the Textures vector
void cTextureManager::AddTexture(cTexture &texture)
{
// CreateTexture(texture.GetFilename(), texture.GetName());
string filename;
string name;
filename = texture.GetFilename();
name = texture.GetName();
texture.texture = LoadTexture(filename.c_str());
texture.SetName(name.c_str());
Textures.push_back(texture);
cout << "Texture Added." << endl;
}[/source]
//Draws a texture at user specified coordinates
void cTextureManager::DrawTexture(string texName, SDL_Surface *Destination, int x, int y)
{
vector
for(it = Textures.begin(); it < Textures.end(); it++)
{
if(it->GetName() == texName)
it->DrawTexture(Destination,x,y);
}
}
//Draws texture at textures coordinates instead of user specified cords.
void cTextureManager::DrawTexture(string texName, SDL_Surface *Destination)
{
vector
for(it = Textures.begin(); it < Textures.end(); it++)
{
if(it->GetName() == texName)
it->DrawTexture(Destination,it->GetX(),it->GetY());
}
}
//Draws all textures at thier coordinates
void cTextureManager::DrawAllTextures(SDL_Surface *Destination)
{
vector
for(it = Textures.begin(); it < Textures.end(); it++)
{
it->DrawTexture(Destination,it->GetX(),it->GetY());
}
}[/source]