【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.

posted @ 2022-12-09 16:13  AnnihilateSword  阅读(119)  评论(0编辑  收藏  举报