SDL文字和图形
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文字和图形的更多相关文章
- 自制单片机之十六……将文字或图形转成LCD上使用的C51字模数据
这一讲说说如何用取模软件将图形转成数据吧,有很多人反复问我这个问题,我就再罗嗦下吧! 取字模的软件有很多款.有的只能将文字转成字模数据,有的既可将文本文字转字模也能将图片转成点阵数据.在这里我就介绍一 ...
- linux 添加文字、图形、线条、箭头的 截图
1.deepin-screenshot 截图 软件包里搜索deepin-screenshot 支持添加文字.图形.线条.箭头的功能 2.字体发虚 Linux mint 开始菜单等字体不清晰 在软件管理 ...
- SDL 开发实战(三):使用 SDL 绘制基本图形
在上文 SDL 开发实战(二):SDL 2.0 核心 API 解析 我们讲解了SDL最核心的API,并结合Hello World代码了解了SDL渲染画面的基本原理. 本文我们来讲一下,如何使用SDL的 ...
- FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器
继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下 MFC 创建和配置. 一.创建 MFC 工程 文件->新建->项目->Visual ...
- [Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG(可缩放矢量图形)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 音视频处理之FFmpeg+SDL+MFC视频播放器20180411
一.FFmpeg+SDL+MFC视频播放器 1.MFC知识 1).创建MFC工程的方法 打开VC++ 文件->新建->项目->MFC应用程序 应用程序类型->基于对话框 取消勾 ...
- Cocoa Drawing Guide学习part1——基础和图形上下文 (转)
原文:http://noark9.github.io/2013/12/28/cocoa-drawing-guide-study-part-1/ 简介 cocoa drawing由AppKit提供并且也 ...
- 《Programming WPF》翻译 第7章 1.图形基础
原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...
- 借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取
写在前面 8月底的时候,@阿里巴巴 推出了一款名为“拯救斯诺克”的闯关游戏,作为前端校园招聘的热身,做的相当不错,让我非常喜欢.后来又传出了一条消息,阿里推出了A-star(阿里星)计划,入职阿里的技 ...
随机推荐
- 别踩白块儿游戏源码Android版
这个项目有带说明文档,大家可以看看源码附件的说明文档吧,“别踩白块儿”是目前非常火的一款游戏,游戏非常简单刺激.关于具体怎么火法怎么玩我就不多说了,相信看到本文的朋友们都非常地清楚. 什么游戏火,我们 ...
- 智力火柴游戏Android源码项目
该游戏源码是一个智力火柴游戏源码,游戏分为难.中.易三种模式,通过对火柴的移动来实现等式分成立,具有极好的市场价值和参考意义. 源码下载: http://code.662p.com/view/9741 ...
- 用Lua扩展谷歌拼音输入法
谷歌拼音输入法最后一次更新是2013年,最近2年毫无动静,这个产品应该已经停了,不过这并不影响对它的使用,我一直喜欢它的简洁和稳定. 说不上来什么原因,忽然想起了摆弄摆弄谷歌拼音输入法的扩展特性(我经 ...
- XLT格式化XML那点事(C#代码中的问题解决)(二)
接上篇<XML通过XSL格式化的那点事(XML到自定义节点折叠显示)>,本文就如何将大的XLST分割成小文件和如何用C#将XML通过XSL生成HTML文件中的问题做下分析,避免有同样需求的 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- hyper容器网络相关源码分析
一.网络初始化 1.hyperd/daemon/daemon.go func NewDaemon(cfg *apitypes.HyperConfig) (*Daemon, error) .... 调用 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- HAOI2015 泛做
T1 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的 ...
- mysql apach php
一.MySql MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将 ...
- Echarts Map地图类型使用
使用的时候出现了一个BUG, China地图的底色没有绘制出来,现在把一个小的DEMO给大家,以供参考,并附上参考文章(http://blog.csdn.net/danielinbiti/articl ...