Public Group

# SDL -- Incorrect output value

This topic is 4415 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Currently im writing a scrolling shooter game. Thanks to your help , im going to finish it soon. This time , a weird problem(maybe?) came up. I use this function to update the status on the screen:
Quote:
 int updStatus() { stats_text = TTF_RenderText_Blended(font_name, "Life:"+life, txt_col ); UPDATE_POSITION( 0, 0, stats_text, screen ); }
The output should be : "Life: and the stored value of (int) life". Well , the output is this : (direct link:http://img133.imageshack.us/img133/143/alienhunteri7ov.jpg) How can i fix it ??

##### Share on other sites
I would try concatinating both into a sstream before hand and trying to render that. My guess is that, since TTF_RenderText_Blended() is expecting a char* as its second parameter, it doesn't know how to deal with the concatination your trying to do.

##### Share on other sites
Yes, sstream it. You are passing an int to a string or char array, so you first need to convert the int to a string.

#include <sstream>...std::stringstream ssLife;int iLife;std::string sLife...ss << "Hits left: ";ss << iLife;sLife = ss.str();stats_text = TTF_RenderText_Blended(font_name, sLife, txt_col );...

Something like that.

##### Share on other sites
Thanks :) , it worked.

Quote:
 int updStatus() {std::stringstream ss;std::string sLife;ss << "Life: ";ss << life;sLife = ss.str();stats_text = TTF_RenderText_Blended(font_name, sLife.c_str(), txt_col );UPDATE_POSITION( 0, 0, stats_text, screen );}

The only thing needed change was "sLife" -> "sLife.c_str()".

##### Share on other sites
hmm..

After i included this function to my main() ,another problem appeared!

When im running the game for about 5-10 minutes the system starts lagging and the window freezes!.
Why this happens?

PS: Without this function the program works great...

##### Share on other sites
You have a memory leak! Each time you call TTF_RenderText_Blended it returns a pointer to a new SDL_Surface. You must always free it with SDL_FreeSurface:
int updStatus(){    std::stringstream ss;    std::string sLife;    ss << "Life: ";    ss << life;    sLife = ss.str();    stats_text = TTF_RenderText_Blended(font_name,    sLife.c_str(), txt_col );    UPDATE_POSITION( 0, 0, stats_text, screen );    SDL_FreeSurface( stats_text );}

##### Share on other sites
Quote:
 Original post by vmanhmm..After i included this function to my main() ,another problem appeared!When im running the game for about 5-10 minutes the system starts lagging and the window freezes!.Why this happens? PS: Without this function the program works great...

I find it hard to believe that your program compiled without using .c_str()...

Were there no errors? Warnings?

Your problem is you are leaking surfaces. Use SDL_FreeSurface() on the surface returned from TTF_RenderText_*().

##### Share on other sites
Quote:
Original post by rip-off
Quote:
 Original post by vmanhmm..After i included this function to my main() ,another problem appeared!When im running the game for about 5-10 minutes the system starts lagging and the window freezes!.Why this happens? PS: Without this function the program works great...

I find it hard to believe that your program compiled without using .c_str()...

Were there no errors? Warnings?

As i said , the only thing that i've changed is .c_str() pointer.

[QUOTE=ME]
The only thing needed change was "sLife" -> "sLife.c_str()".
[/quote]
If you still dont believe me , here's the proof :
(WARNING: thats the bugged version)
http://rapidshare.de/files/23041026/Alien_Hunter_bugedVER.zip.html

##### Share on other sites
oops i forgot to thank you for your suggestions

##### Share on other sites
To avoid constantly reallocating and freeing the surface, you may consider keeping a 'static' (in the sense of outliving the function) surface around, and re-creating it only when the 'life' value changes. There are numerous approaches to this, and usually OO techniques would be shown; but in the interest of keeping the example as simple as possible:

int updStatus() {  // The value (if any) that was rendered last time.  static int renderedLife;  // It looks like you already have a global, or otherwise wider-scoped,  // 'stats_text' for the surface. I will use that one...  if (stats_text && (life != renderedLife)) {    // there is an invalid surface to clean up.    SDL_FreeSurface(stats_text);  }  if (!stats_text) {    // either it was just cleaned up, or this is the first run.    // Cache the rendered life value so we know for next time.    renderedLife = life;    // Set up the surface. Note a couple of techniques here ;)    std::stringstream ss("Life: ");    ss << life;    stats_text = TTF_RenderText_Blended(font_name, sLife.str().c_str(), txt_col);  }  // I really hope this isn't a macro :(  UPDATE_POSITION( 0, 0, stats_text, screen );}

Of course, you normally only optimize when you need to, and making sure you don't leak memory may well be optimization enough - but I thought you should be familiar with this sort of technique in general, because some "resources" (like SDL surfaces) can be very expensive to acquire, depending on your environment.

1. 1
2. 2
Rutin
24
3. 3
JoeJ
19
4. 4
5. 5

• 17
• 40
• 23
• 13
• 13
• ### Forum Statistics

• Total Topics
631729
• Total Posts
3001918
×