一、前言

从本卷开始,代码做了一定的简化,去掉了不必要的封装,尽量每个模块以讲述功能为主,让示例更加浅显易懂

本卷介绍使用 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[])
{// Initif (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 RunningSDL_Event event;bool running = true;while (running){// Event Loopwhile (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 upTTF_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.

【SDL游戏编程入门第十六卷】输出中文SDL_ttf以及设置中文标题相关推荐

  1. shell 脚本比较字符串相等_LINUX快速入门第十六章:Shell 流程控制

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?phpif (isset($_GET["q"])) { s ...

  2. Android入门第十六篇之Style与Theme

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.. ...

  3. c# 编程入门第六课常量,枚举,枚举转换成其他类型变量(枚举和int,转 string字符串转枚举),结构体,数组,冒泡排序,实际使用排序,方法(函数)

    c# 编程入门第六课 文章目录 c# 编程入门第六课 1. 常量 2. 枚举 3. 枚举转换成其他类型变量 3.1 枚举和int 3.2 转string 3.2 字符串转枚举 4.结构体 5.数组 7 ...

  4. 2021-11-23----韩顺平Java入门第十四天

    韩顺平Java入门第十四天(排序.查找) 1.排序     1).排序的介绍:排序是将多个数据,依指定的顺序进行排列的过程.     2).内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序 ...

  5. QT入门第十天 QT安装和使用alsa库和jpeg库实现音视频录制

    QT入门第十天QT安装和使用alsa库和jpeg库实现音视频录制 第一章 ALSA库的移植和使用 1.ALSA简介 2.移植ALSA (1)移植步骤 3.把移植好的库下载到开发板配置 4.使用移植好的 ...

  6. QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号

    QT入门第十四天 串口通信[QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号 第一章 常见的硬件通信接口协议 [1]硬件通信接口协议 [2]使用串 ...

  7. python编程入门第3版pdf-Python编程入门第3版PDF电子书免费下载

    本文档的主要内容详细介绍的是Python编程入门第3版PDF电子书免费下载. Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,自20世纪90年代初诞生至今,逐渐被广泛应用于处理系统 ...

  8. C语言编程>第二十六周 ⑥ 请补充fun函数,该函数的功能是:按 “0”到 “9”统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。注意:不能使用字符串库函数。

    例题:请补充fun函数,该函数的功能是:按 "0"到 "9"统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中.注意:不能使用字符串库函数. ...

  9. C语言编程>第二十六周 ① 函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。

    例题:函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换.形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动. 例如,若a所指数组中的数据依次为:11 22 33 ...

最新文章

  1. yanf4j引入了客户端非阻塞API
  2. 【JAVA并发编程实战】1、对象的共享
  3. Android Bootloader LittleKernel的两篇文章 【转】
  4. C#查找指定窗口的子窗口的句柄
  5. java---多线程及线程的概念
  6. 从0开始html前端页面开发_CSS设置图像边框阴影
  7. 三十年了,读书依然不求甚解:一个普通程序员的读书生涯回顾
  8. 快消品图像识别丨无人店背后的商品识别技术
  9. Simulink三相电机仿真(4)
  10. 腾讯地图标注_怎样在导航地图上标注公司名和位置
  11. XDS100 V2仿真器驱动及安装指导
  12. 如何证明圆锥面积=1/3圆柱面积?
  13. 尝试做个公众号,歌曲类型的,有兴趣可以关注一下
  14. robosense 16线激光雷达标定
  15. 一些常用的postman测试脚本
  16. 针对写好的网页随着窗口大小改变,里面布局变乱的解决方法
  17. SAP 销项税多科目配置
  18. 为什叫c语言,为什么c语言叫c语言?
  19. 较简单的c语言航班管理系统
  20. 多维数据驱动的粮食安全分析与智能决策系统研究与实践

热门文章

  1. Heston SV model期权定价(基于numpy)
  2. 月圆夜,又中秋,抽个奖,祝好运。
  3. C语言volatile 关键字
  4. WebServer代码实现第四版
  5. 面对对象+面对过程+类与对象+this关键字+构造方法及重载+面对对象练习
  6. 中国高校ftp 汇总
  7. 职业修炼:高效沟通的三大技巧
  8. GPU-Z的像素填充率、纹理填充率、显存带宽计算公式
  9. win2008+wmiprvse.exe占用CPU高的解决方案
  10. Docker快速入门—高级篇【快速浏览版】