Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


Game Engine Problem with loading multiple textures- HELP!


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 Ars7c3   Members   -  Reputation: 179

Like
0Likes
Like

Posted 25 June 2012 - 08:18 AM

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
Posted Image )
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 vectorvoid 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 vectorvoid 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]

Sponsor:

#2 Ars7c3   Members   -  Reputation: 179

Like
-1Likes
Like

Posted 25 June 2012 - 08:12 PM

Hello? I would really appreciate a response... Still stuck on this dumb problem Posted Image .

#3 thecoast47   Members   -  Reputation: 255

Like
0Likes
Like

Posted 25 June 2012 - 10:50 PM

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.

Edited by thecoast47, 25 June 2012 - 10:52 PM.


#4 sednihp   Members   -  Reputation: 241

Like
0Likes
Like

Posted 27 June 2012 - 10:07 AM

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.

#5 BenMatlock   Members   -  Reputation: 137

Like
1Likes
Like

Posted 27 June 2012 - 11:29 AM

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 Posted Image ) This way reallocating the vector will only move the pointers around, which won't destroy/affect the texture objects themselves.

Edited by BenMatlock, 27 June 2012 - 11:41 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS