SDL本身没有显示文字功能,它需要用扩展库SDL_ttf来显示文字。ttf是True Type Font的缩写,ttf是Windows下的缺省字体,它有美观,放大缩小不变形的优点,因此广泛应用很多场合。freeType是一个跨平台开源项目, 它可以在利用ttf字体输出到屏幕上。一般的linux发行版本都带了这个库(libfreetype.so),Windows下也有相应的移植版本。

SDL_ttf封装freetype的库函数,提供一些简化的扩展接口提供SDL开发者使用。

使用ttf库的第一件事要从Windows的字库下拷贝出一个字库出来,最好是中文字体,这样可以同时支持英文和中文显示。它一般在c:\windows \fonts 目录下面。比如simsun.ttf 就是仿宋体的字库,将这个文件拷贝到你的项目目录下。或者一个指定目录。

在上一篇,加入下面代码:

Tao.Sdl.SdlTtf.TTF_Init();

font36 = Tao.Sdl.SdlTtf.TTF_OpenFont(Application.StartupPath + "\\simfang.ttf", 36);

if (font36 == IntPtr.Zero)

{

MessageBox.Show("SDL字体初始化失败!");

return;

}

font24 = Tao.Sdl.SdlTtf.TTF_OpenFont(Application.StartupPath + "\\simfang.ttf", 24);

if (font24 == IntPtr.Zero)

{

font24 = font36;

}

Tao.Sdl.SdlTtf.TTF_SetFontStyle(font36, Tao.Sdl.SdlTtf.TTF_STYLE_BOLD);

Tao.Sdl.SdlTtf.TTF_SetFontStyle(font24, Tao.Sdl.SdlTtf.TTF_STYLE_BOLD);

int w = 0, h = 0;

Tao.Sdl.SdlTtf.TTF_SizeUNICODE(font36, "测试文字1", out w, out h);

rect2 = new Tao.Sdl.Sdl.SDL_Rect(5, (short)(20), 400, 400);

IntPtr chinese = Tao.Sdl.SdlTtf.TTF_RenderUNICODE_Blended(font36, "测试文字1",new Tao.Sdl.Sdl.SDL_Color(255, 255, 0));

Tao.Sdl.Sdl.SDL_BlitSurface(chinese, ref rect, surfacePtr, ref rect2);

Tao.Sdl.Sdl.SDL_FreeSurface(chinese);

rect2 = new Tao.Sdl.Sdl.SDL_Rect(5, (short)(20 + h), 400, 400);

chinese = Tao.Sdl.SdlTtf.TTF_RenderUNICODE_Blended(font24, "测试文字2", newTao.Sdl.Sdl.SDL_Color(255, 0, 255));

Tao.Sdl.Sdl.SDL_BlitSurface(chinese, ref rect, surfacePtr, ref rect2);

Tao.Sdl.Sdl.SDL_FreeSurface(chinese);

Tao.Sdl.SdlGfx.stringRGBA(surfacePtr, 300, 300, "test string", 0, 255, 0, 255);

Tao.Sdl.SdlGfx.lineRGBA(surfacePtr, 150, 150, 300, 300, 255, 60, 255, 255);

short[] xs = new short[4];

short[] ys = new short[4];

xs[0] = 20;

xs[1] = 120;

xs[2] = 120;

xs[3] = 20;

ys[0] = 20;

ys[1] = 20;

ys[2] = 120;

ys[3] = 120;

Tao.Sdl.SdlGfx.polygonRGBA(surfacePtr, xs, ys, 4, 255, 0, 0, 255);

Tao.Sdl.SdlGfx.circleRGBA(surfacePtr, 200, 200, 100, 0, 0, 255, 255);

Tao.Sdl.SdlGfx.boxRGBA(surfacePtr, 350, 350, 450, 450, 0, 0, 255, 255);

Tao.Sdl.SdlGfx.filledTrigonRGBA(surfacePtr, 300, 50, 200, 150, 400, 150, 255, 255, 0, 255);

Tao.Sdl.Sdl.SDL_Flip(surfacePtr);

Tao.Sdl.Sdl.SDL_UpdateRect(surfacePtr, 0, 0, rect.w, rect.h);

释放:

Tao.Sdl.SdlTtf.TTF_CloseFont(font36);

Tao.Sdl.SdlTtf.TTF_CloseFont(font24);

Tao.Sdl.SdlTtf.TTF_Quit();

TTF_OpenFont:打开字体,因为中途不能修改字体大小,所以打开2个,没办法的办法。另外注意字体路径下不能包含任何中文字符。

TTF_SetFontStyle:设置字体样式

TTF_SizeUNICODE:获取字体高度宽度,可以控制字符间距和行距。

TTF_RenderUNICODE_Blended:渲染字体,得到一个surface

stringRGBA:只能渲染英文字符,比较简单

lineRGBA:画线

polygonRGBA:画面

circleRGBA:画圆

boxRGBA:画填充矩形

filledTrigonRGBA:画填充三角形

SDL_ttf的编程的核心数据结构是TTF_Font 所有的文字输出都是围绕这个结构展开的。

显示一段文字的流程

一.初始TTF库

二.创建一个对应某个字体文件的TTF_Font.

三.用TTF输出函数把一段文字输出成SDL_Surface.其中TTF_font是其中必须参数

四.把这个SDL_Surface 输出到屏幕显示,如果不需它,必须释放它

五.释放TTF_Font

六.关闭TTF库

其中在一个程序中,可以同时打开多个TTF_Font.可以可以用输出方法输出N个SDL_Surface.这个完全看你的设计要求。只要在退出时记得一一释放即可。

关于中文输出

这个问题是一个比较复杂的问题,复杂的原因在于SDL是一个跨平台的库,而两大平台Linux和Windows对于中文的内部编码是不一致的。分别采用UTF-8和Unicode.

而SDL_ttf对于编码是非常敏感的,必须明确告诉它是哪一种编码,才能正确输出。否则将输出乱码。可以用iconv转换编码。

SDL两种编码都可以直接输出

UNICODE输出:

SDL_Surface *TTF_RenderUNICODE_Solid(TTF_Font *font, const Uint16 *text, SDL_Color fg) ;

UTF-8输出:

SDL_Surface *TTF_RenderUTF8_Solid(TTF_Font *font, const char *text, SDL_Color fg) ;

简单言之,如果你的在LINUX下输入在代码中直接写成的中文,那它就是UTF-8的编码,如果在WINDOWS用文本编辑器输出中文,它就是Unicode的编码,这个你可以用二进制编辑工具查看。

这样如果源码是在WINDOWS编辑后,拷贝到LINUX上编译,这个时候就会发生混乱了,用TTF_RenderUTF8_Solid输出必然是乱码.

所以为了保险,可以在源代码用数组用固定的编码。这样无论在哪个平台都能正确输出。另外一种情况把文件写在带BOM头的文件里,这样可以知道文件内部编码,以便程序采用相应用输出。

还一些特殊情况,比如网上所有LRC歌词文件,必须是GBK格式,实测所有音乐软件都只认这个编码。这样需要用iconv转换成Unicode或UTF-8格式.

同样的 Unicode/UTF-8的输出还有其它两组

TTF_RenderUTF8_Shaded

TTF_RenderUNICODE_Shaded

TTF_RenderUTF8_Blended

TTF_RenderUNICODE_Blended

SDL文字和图形的更多相关文章

  1. 自制单片机之十六……将文字或图形转成LCD上使用的C51字模数据

    这一讲说说如何用取模软件将图形转成数据吧,有很多人反复问我这个问题,我就再罗嗦下吧! 取字模的软件有很多款.有的只能将文字转成字模数据,有的既可将文本文字转字模也能将图片转成点阵数据.在这里我就介绍一 ...

  2. linux 添加文字、图形、线条、箭头的 截图

    1.deepin-screenshot 截图 软件包里搜索deepin-screenshot 支持添加文字.图形.线条.箭头的功能 2.字体发虚 Linux mint 开始菜单等字体不清晰 在软件管理 ...

  3. SDL 开发实战(三):使用 SDL 绘制基本图形

    在上文 SDL 开发实战(二):SDL 2.0 核心 API 解析 我们讲解了SDL最核心的API,并结合Hello World代码了解了SDL渲染画面的基本原理. 本文我们来讲一下,如何使用SDL的 ...

  4. FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...

  5. [Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG(可缩放矢量图形)

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. 音视频处理之FFmpeg+SDL+MFC视频播放器20180411

    一.FFmpeg+SDL+MFC视频播放器 1.MFC知识 1).创建MFC工程的方法 打开VC++ 文件->新建->项目->MFC应用程序 应用程序类型->基于对话框 取消勾 ...

  7. Cocoa Drawing Guide学习part1——基础和图形上下文 (转)

    原文:http://noark9.github.io/2013/12/28/cocoa-drawing-guide-study-part-1/ 简介 cocoa drawing由AppKit提供并且也 ...

  8. 《Programming WPF》翻译 第7章 1.图形基础

    原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...

  9. 借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取

    写在前面 8月底的时候,@阿里巴巴 推出了一款名为“拯救斯诺克”的闯关游戏,作为前端校园招聘的热身,做的相当不错,让我非常喜欢.后来又传出了一条消息,阿里推出了A-star(阿里星)计划,入职阿里的技 ...

随机推荐

  1. Spring配置JNDI和通过JNDI获取DataSource

    一.SpringJNDI数据源配置信息 <bean id="dataSource" class="org.springframework.jndi.JndiObje ...

  2. W3School-CSS 定位 (Positioning) 实例

    CSS 定位 (Positioning) 实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 ...

  3. Tips for Planning Your Business Startup

    原文链接:http://domaintree.me/?p=1037 By Robert Thibodeau –  Starting a business can be a very daunting ...

  4. sk_buff 里的len, data_len, skb_headlen

    http://blog.csdn.net/kakadiablo/article/details/7948414 struct sk_buff *skb; skb->len 是data长度,包含所 ...

  5. Java迷宫游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...

  6. [tem]线段树练习

    1080 线段树练习 单点修改,区间查询和 #include <iostream> #include <cstdio> #include <algorithm> # ...

  7. ThreadLocal

    package cn.happy.util; import org.hibernate.Session;import org.hibernate.SessionFactory;import org.h ...

  8. PAT 1041. 考试座位号(15)

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...

  9. k-develop 在ros上面的应用

    sudo apt-get install kdevelop 根据wiki上面的ros 章节中,关于kdevelop的介绍,配置好环境即可. 导入工程时,选中src/src下面的章节,不过,需要注意去掉 ...

  10. 【笔记4】用pandas实现条目数据格式的推荐算法 (基于用户的协同)

    ''' 基于用户的协同推荐 条目数据 ''' import pandas as pd from io import StringIO import json #数据类型一:条目(用户.商品.打分)(避 ...