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

Работаю над клоном Pong. Возникли серьезные проблемы с попыткой отобразить счет на экране. Многие вещи, которые я нашел, используют изображения, но я просто хочу использовать текст для отображения числа баллов. Я пытаюсь использовать библиотеку 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?


person CharlieFan39    schedule 12.07.2015    source источник


Ответы (1)


Есть несколько способов сделать это. Вы можете сделать это с помощью 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*`

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

person jrd1    schedule 12.07.2015
comment
Я попытался скопировать и вставить этот код и настроить его для своей программы, но теперь я не получаю никакого вывода из любого текста в окне при запуске. - person CharlieFan39; 13.07.2015
comment
@CharlieFan39 Правильно ли вы инициализировали соответствующие библиотеки? Вы включили SDL_RENDERER_ACCELERATED? - person jrd1; 13.07.2015
comment
Да, у меня есть. То, как я пытался раньше, дало мне неправильный вывод, но по какой-то причине у меня сейчас нет вывода. Я так потерян с этим. - person CharlieFan39; 13.07.2015
comment
@CharlieFan39 CharlieFan39 Ты и я оба, это код из рабочего проекта SDL, который я сделал. Не зная ваших настроек, я мало что могу прокомментировать. Но вот снимок в темноте: как насчет цвета отрисовки вашего рендерера? Вы пробовали это изменить? - person jrd1; 13.07.2015
comment
Мои извинения, это именно то, в чем была проблема. Есть ли способ сделать это для счета обоих игроков, не повторяя все это снова? - person CharlieFan39; 13.07.2015
comment
@CharlieFan39: Если вы имеете в виду, как избежать переписывания всего этого кода, то у вас есть два варианта: определить функцию, которая загружает шрифт и возвращает SDL_Texture* (то есть созданную текстуру), или инкапсулировать ее с помощью класса (вышеупомянутого код фактически удален из класса). Я бы сказал, что использование класса лучше и дает вам больше повторного использования кода, но это уже другая история. - person jrd1; 13.07.2015
comment
Думаю, я просто попробую сделать это как функцию. Есть ли где-нибудь, где я мог бы найти хороший пример использования его в классе? Кстати, спасибо за помощь. - person CharlieFan39; 13.07.2015
comment
@CharlieFan39: Учебники LazyFoo. Хорошо начать с #7 (для справочной информации), затем посмотреть, как эта информация инкапсулирована, возможно, следующим будет #10 и другие (это будет зависеть от того, что вы хотите сделать). lazyfoo.net/tutorials/SDL/index.php Удачи! - person jrd1; 13.07.2015
comment
@CharlieFan39: Добро пожаловать! И тебе спасибо! - person jrd1; 13.07.2015