Game Engine Problem with loading multiple textures- HELP!

Started by
3 comments, last by BenMatlock 11 years, 10 months ago
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
biggrin.png )
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<cTexture> 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<cTexture>::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<cTexture>::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<cTexture>::iterator it;

for(it = Textures.begin(); it < Textures.end(); it++)
{
it->DrawTexture(Destination,it->GetX(),it->GetY());
}
}[/source]
Advertisement
Hello? I would really appreciate a response... Still stuck on this dumb problem dry.png .
At what line exactly does the application crash?
*edit*
I think you need to post ALL of the method/function/constructor definitions for both classes if you want anyone to solve your problem.
Whenever I get stuck on this kind of thing, I reach for printf and put it after every line with something like printf("draw texture 1\n"), printf("draw texture 2\n") etc etc.. Then I know where the game crashes because I can see what the last line printed out was. Not the best way to do it I imagine (a proper debugger would be the professional way), but it might help you to realise what line your issue is caused by.
From what i see, your texture list is vector<cTexture>, so your textures are held by value. If you add a new one, you might reallocate the vector's buffer which will copy then destroy all your existing textures. I don't know how your cTexture class handles being copied, but it has a good chance to be the issue. You should insert the textures in the manager by pointer, by dynamically allocating them with new/delete (or something that wraps those, I won't get in the smart pointer topic here smile.png ) This way reallocating the vector will only move the pointers around, which won't destroy/affect the texture objects themselves.

This topic is closed to new replies.

Advertisement