1

当我在屏幕上绘图时,我想显示游戏得分的动态文本区域。唯一的问题是,当我重绘屏幕时,它没有用新的分值更新,并且零后出现乱码。我要做的是存储一个 int 来保持玩家得分并增加该 int 并在屏幕上重新绘制新值。

void drawText(SDL_Surface* screen,
char* string,
int posX, int posY)
{
TTF_Font* font = TTF_OpenFont("ARIAL.TTF", 40);

SDL_Color foregroundColor = { 255, 255, 255 };
SDL_Color backgroundColor = { 0, 0, 0 };

SDL_Surface* textSurface = TTF_RenderText_Shaded(font, string,
    foregroundColor, backgroundColor);

SDL_Rect textLocation = { posX, posY, 0, 0 };

SDL_BlitSurface(textSurface, NULL, screen, &textLocation);

SDL_FreeSurface(textSurface);

TTF_CloseFont(font);
}

char convertInt(int number)
{
stringstream ss;//create a stringstream
ss << number;//add number to the stream
std::string result =  ss.str();//return a string with the contents of the stream

const char * c = result.c_str();
return *c;
}

score = score + 1;
char scoreString = convertInt(score);
drawText(screen, &scoreString, 580, 15);
4

1 回答 1

3

关于乱码输出,这是因为您convertInt通过使用地址运算符 ( &) 将接收到的单个字符用作字符串。该单个字符之后的内存中的数据可能包含任何内容,而且很可能不是特殊的字符串终止符。

为什么要从字符串中返回单个字符?使用 egstd::to_string并返回整个std::string,或继续使用 thestd::stringstream并从中返回正确的字符串。

至于未更新的号码,可能是您有一个多位数的号码,但您只返回第一个数字。按照我上面的建议,返回字符串,并std::string在对 的调用中继续使用drawText,它可能会更好地工作。


看来您不允许更改drawText功能,请使用以下内容:

score++;
// Cast to `long long` because VC++ doesn't have all overloads yet
std::string scoreString = std::to_string(static_cast<long long>(score));
drawText(screen, scoreString.c_str(), 580, 15);
于 2013-01-02T00:11:22.270 回答