【SDL游戏编程入门第十六卷】输出中文SDL_ttf以及设置中文标题
一、前言
从本卷开始,代码做了一定的简化,去掉了不必要的封装,尽量每个模块以讲述功能为主,让示例更加浅显易懂
本卷介绍使用 SDL_ttf 输出中文,以及如何设置中文标题。
二、SDL_ttf 输出中文
本卷使用的中文字体是微软自带的黑体 simhei.ttf
// 【这里设置 utf-8 字符集】
#pragma execution_character_set("utf-8")
这个是关键,然后在加载字体时使用的函数也要更改
TTF_RenderUTF8_Solid
,当然还有 TTF_RenderUTF8_Blended
等等,这里使用 后者
// 加载字体
const char* text = "中文!";
TTF_Font* font = TTF_OpenFont("res/fonts/simhei.ttf", 28);
SDL_Surface* blendSurface = TTF_RenderUTF8_Blended(font, text, { 255, 255, 255, 255 }); // 文字是白色
SDL_Texture* blendTexture = SDL_CreateTextureFromSurface(renderer, blendSurface);
SDL_Rect blendRect = { 0, 0, blendSurface->w, blendSurface->h };
SDL_FreeSurface(blendSurface);
其他都是之前的内容,下面贴出代码
1. 代码示例
#include <iostream>
#include <SDL.h>
#include <SDL_ttf.h>
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")
#pragma comment(lib, "SDL2_ttf.lib")
// 【这里设置 utf-8 字符集】
#pragma execution_character_set("utf-8")
constexpr int SRC_WIDTH = 640;
constexpr int SRC_HEIGHT = 480;
// 错误处理
#define MyError(ErrorMessage) \
{\
std::cout << "[Error]: " << (ErrorMessage) << std::endl;\
return -1;\
}
int main(int argc, char* argv[])
{
// Init
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
MyError("Failed to Initialize SDL!");
if (TTF_Init() == -1)
MyError("Failed to Initialize TTF!");
SDL_Window* window = SDL_CreateWindow("HelloSDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SRC_WIDTH, SRC_HEIGHT, SDL_WINDOW_SHOWN);
if (!window)
MyError("Failed to create window!");
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (!renderer)
MyError("Failed to create window renderer");
// 加载字体
const char* text = "中文!";
TTF_Font* font = TTF_OpenFont("res/fonts/simhei.ttf", 28);
//SDL_Surface* solidSurface = TTF_RenderText_Solid(font, text, { 255, 255, 255, 255 }); // 这个是不能正常输出中文的,会乱码
SDL_Surface* blendSurface = TTF_RenderUTF8_Blended(font, text, { 255, 255, 255, 255 }); // 文字是白色
SDL_Texture* blendTexture = SDL_CreateTextureFromSurface(renderer, blendSurface);
SDL_Rect blendRect = { 0, 0, blendSurface->w, blendSurface->h };
SDL_FreeSurface(blendSurface);
// Game Running
SDL_Event event;
bool running = true;
while (running)
{
// Event Loop
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
running = false;
}
// 清屏(黑色)
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
// 绘制字体
SDL_RenderCopy(renderer, blendTexture, nullptr, &blendRect);
// 更新屏幕
SDL_RenderPresent(renderer);
}
// Clear up
TTF_CloseFont(font);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
TTF_Quit();
SDL_Quit();
return 0;
}
2. 运行结果
三、设置中文标题
// 【这里设置 utf-8 字符集】
#pragma execution_character_set("utf-8")
同上,设置了 utf-8 字符集即可设置中文标题
SDL_Window* window = SDL_CreateWindow("中文标题", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SRC_WIDTH, SRC_HEIGHT, SDL_WINDOW_SHOWN);
1. 运行结果
本节内容就到这里了,下卷会继续分享 SDL 的基本使用
The End.