SDL показать счет на экране

Работаю над клоном Понг. Возникли серьезные проблемы с попыткой отобразить счет на экране. Многие вещи, которые я обнаружил, используют изображения, но я просто хочу использовать текст для отображения номера счета. Я пытаюсь использовать библиотеку SDL TTF для загрузки и отображения шрифта, но он не будет отображаться правильно. Я нашел этот вопрос Как моргнуть Оценка на экране в SDL? и ответ сказал использовать SDL_BlitSurface (), который я попытался, и я только что получил ошибку сборки (при условии, что я делал это правильно)

Вот функция, которую я вызываю для рисования счета:

void Pong::drawScore(){
leftScoreChar = leftScore;
rightScoreChar = rightScore;

SDL_Color text_color = {255, 255, 255};

score = TTF_RenderText_Solid(font,
&leftScoreChar,
text_color);

score2 = TTF_RenderText_Solid(font,
&rightScoreChar,
text_color);

leftScoreText = SDL_CreateTextureFromSurface(renderer, score);
rightScoreText = SDL_CreateTextureFromSurface(renderer, score2);

SDL_RenderCopy(renderer, leftScoreText, NULL, &scoreA);
SDL_RenderCopy(renderer, rightScoreText, NULL, &scoreB);
}

Который при запуске выводит это:
https://goo.gl/dZxDEa

Извиняюсь, я бы поставил изображение в посте, но, видимо, не могу.

И счет не будет отображаться, если целое число, хранящее счет, не будет равно 1 по какой-то причине и не будет отображаться как ноль. И счет явно увеличивается, потому что я должен вывести игру на консоль, чтобы убедиться. Так что же я делаю неправильно, из-за чего мой счет отображается неправильно и что-то в 00?

2

Решение

Есть несколько способов сделать это. Вы можете сделать это через SDL_Surfaceили SDL_Texture, Я проиллюстрирую оба. (Адаптируйте при необходимости.)

int fontsize = 24;
int t_width = 0; // width of the loaded font-texture
int t_height = 0; // height of the loaded font-texture
SDL_Color text_color = {0,0,0};
string fontpath = "my font path";
string text = "text I want to display";
TTF_Font* font = TTF_OpenFont(fontpath.c_str(), fontsize);
SDL_Texture* ftexture = NULL; // our font-texture

// check to see that the font was loaded correctly
if (font == NULL) {
cerr << "Failed the load the font!\n";
cerr << "SDL_TTF Error: " << TTF_GetError() << "\n";
}
else {
// now create a surface from the font
SDL_Surface* text_surface = TTF_RenderText_Solid(font, text.c_str(), text_color);

// render the text surface
if (text_surface == NULL) {
cerr << "Failed to render text surface!\n";
cerr << "SDL_TTF Error: " << TTF_GetError() << "\n";
}
else {
// create a texture from the surface
ftexture = SDL_CreateTextureFromSurface(renderer, text_surface);

if (ftexture == NULL) {
cerr << "Unable to create texture from rendered text!\n";
}
else {
t_width = text_surface->w; // assign the width of the texture
t_height = text_surface->h; // assign the height of the texture

// clean up after ourselves (destroy the surface)
SDL_FreeSurface(surface);
}
}
}

Обратите внимание, вы можете просто перестать использовать только поверхность. Однако, поскольку поверхность визуализируется программным обеспечением, текстура, возможно, лучше, так как она загружается в VRAM. (Подробнее читайте здесь: Разница между поверхностью и текстурой (SDL / общая))

Затем все, что вам нужно сделать, это отрендерить (аналогично этому):

int x = 0;
int y = 0;
SDL_Rect dst = {x, y, t_width, t_height};
SDL_RenderCopy(renderer, ftexture, NULL, &dst); // renderer is a variable of the type `SDL_Renderer*`

И наконец, помните, что порядок отображения вещей имеет значение!

0

Другие решения


По вопросам рекламы [email protected]