刚刚创建了一个函数来缓存我在SDL2中构建的小游戏引擎中的任何加载的字体,以下函数完美地工作,并且渲染文本比每次创建新的SDL_Surface快12倍我需要文字。然而,正如你所看到的,它只缓存ANSI字符,这是好的英语,但如果我曾经想翻译我的游戏(德语变音,或西里尔字形不可在ANSI)SDL2中的UTF文本
void cacheFonts(){
for(unsigned int i = 0; i < GlobalFontAssets.size; i++){
SDL_Colour color_font = {255, 255, 255, 255};
std::vector<SDL_Texture*> tempVector;
for(int j = 32; j < 128; j++){
char temp[2];
temp[0] = j;
temp[1] = 0;
SDL_Surface* glyph = TTF_RenderUTF8_Blended(GlobalFontAssets.fonts[i], temp, color_font);
SDL_Texture* texture =
SDL_CreateTextureFromSurface(renderer, glyph);
tempVector.push_back(texture);
SDL_FreeSurface(glyph);
}
GlobalFontAssets.cache.push_back(tempVector);
}
printf("Global Fonts Cached!\n");
}
我使用wchar_t
,从0到256^2循环都试过了,但我不能得到任何字符使用printf
,wprintf
,cout
和wcout
打印偶数,但是,如果我做的:
std::string str = "Привет, öäü"
printf("%s\n", str.c_str());
然后打印字符串在终端上就好了。我应该提到,我使用的是Ubuntu 16.04,因此仅Windows的解决方案对我无效,理想情况下我希望以便携方式进行操作。对于那些不熟悉SDL的人来说,我所需要的只是一种获取C字符串中每个UTF8字符的方法。我希望这是可能的。
嗯,C-ish C++代码。建议只有1个语言标记来改善帖子。 – chux
与256个扩展ASCII字符相比,有*百万*的Unicode字形。你不能盲目地使用相同的方法。除此之外,在Unicode中有“组合字符”,它们不能与修饰字符分开渲染,你必须处理字形单位而不是字符单位。 –
@BenVoigt你的意思是Latin-1而不是ASCII? – Deduplicator