Вывод русского тексты с помощью SDL_ttf

193
11 января 2019, 15:00

С латиницей проблем нет, все работает как надо, но вместо кириллицы совершенно другие символы. Вот код, если это поможет.

#include <iostream>
#include <vector>
#include <SDL.h>
#include <SDL_ttf.h>
#include <stdlib.h>
using namespace std;
string OUT_STRING;
SDL_Color color = { 255,255,255 };

char* cts(char c)
{
    char *ptr = (char*)malloc(2 * sizeof(char));
    ptr[0] = c;
    ptr[1] = '\0';
    return ptr;
}
void TextOut(SDL_Renderer *ren, TTF_Font *f)
{
    SDL_Surface *sur;
    SDL_Texture *tex;
    static SDL_Rect rect;
    static int32_t x;
    if (OUT_STRING[x] == NULL) return;
    char *temp = cts(OUT_STRING[x]);
    TTF_SizeText(f, temp, &rect.w, &rect.h);
    if (!(sur = TTF_RenderText_Blended(f, temp, color))) cout << "BLEND - ERROR" << endl;
    else cout << "BLEND - SUCCESS" << endl;
    free(temp);
    tex = SDL_CreateTextureFromSurface(ren, sur);
    if (!tex) cout << "TEX - ERROR" << endl;
    else cout << "TEX - SUCCESS" << endl;
    SDL_RenderCopy(ren, tex, NULL, &rect);
    SDL_RenderPresent(ren);
    rect.x += rect.w;
    x++;
    SDL_FreeSurface(sur);
    SDL_Delay(50);
}
int main(int argc, char* argv[])
{
    SDL_Window *main_window;
    SDL_Renderer *renderer;
    SDL_Surface *screen;
    SDL_Surface *text;
    SDL_Event e;
    TTF_Font *font;
    SDL_Rect rect;
    SDL_Texture *texture;
    bool quit = false;
    SDL_Init(SDL_INIT_EVERYTHING);
    TTF_Init();
    main_window = SDL_CreateWindow("My window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 1000, SDL_WINDOW_SHOWN);
    font = TTF_OpenFont("C:/Users/STAS/source/repos/ConsoleApplication3/ConsoleApplication3/l_10646.ttf", 32);
    if (!font) cout << "FONT - ERROR" << endl;
    else cout << "FONT - SUCCESS" << endl;
    renderer = SDL_CreateRenderer(main_window, -1, 0);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
    SDL_RenderClear(renderer);
    OUT_STRING = "English текст";
    rect.x = 100;
    rect.y = 100;
    while (!quit)
    {
        while (SDL_PollEvent(&e) != 0)
        {
            if (e.type == SDL_QUIT) quit = true;
        }
        TextOut(renderer, font);
        cout << "SECOND LOOP" << endl;
    }
    SDL_Delay(3000);
    return 0;
}
Answer 1

Функция TTF_RenderText_Blended принимает на вход строку с латиницей в кодировке ISO/IEC 8859-1. Для рисования прочих символов следует использовать RenderUTF8_Blended или RenderUNICODE_Blended:

static_assert(sizeof(wchar_t) == sizeof(Uint16));
TTF_RenderUNICODE_Blended(font, reinterpret_cast<Uint16 const *>(L"English текст"), color)
READ ALSO
В чем ошибка? Можно ли вообще использовать такую структуру кода?

В чем ошибка? Можно ли вообще использовать такую структуру кода?

Самостоятельно обучаюсь программированиюСейчас пытаюсь решить задачу, найденную в интернете

201
создание dll в codeblocks

создание dll в codeblocks

Всем приветСоздаю dll в codeblocks, имею структуру проекта main

188
Не читается второй раз getline

Не читается второй раз getline

Появилась проблема с getline(file, string)Я хочу, чтобы с помощью этой программы было сначала высчитано количество строк в файле, а потом уже эти строки...

146
Как программно удалить Textview

Как программно удалить Textview

Всем привет! В приложении при нажатии кнопки появляется Textview с фономПри нажатии кнопки повторно, Textview "пропадает"

185