Когда я рисую на экране, я хочу показать динамическую текстовую область для игрового счета. Единственная проблема в том, что когда я перерисовываю экран, он не обновляется с новым значением счета, а также появляются искаженные символы, которые появляются после нуля. То, что я пытаюсь сделать, — это сохранить значение 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);
Что касается искаженного вывода, это потому, что вы используете один символ, который вы получаете от convertInt
в виде строки с использованием оператора адресации (&
). Данные в памяти после этого единственного символа могут содержать что угодно, и, скорее всего, не специальный символ конца строки.
Зачем возвращать один символ из строки? Используйте, например, std::to_string
и вернуть все std::string
или продолжайте использовать std::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);
Других решений пока нет …