zoukankan      html  css  js  c++  java
  • 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(font36Tao.Sdl.SdlTtf.TTF_STYLE_BOLD);

                Tao.Sdl.SdlTtf.TTF_SetFontStyle(font24Tao.Sdl.SdlTtf.TTF_STYLE_BOLD);

     

                int w = 0, h = 0;

                Tao.Sdl.SdlTtf.TTF_SizeUNICODE(font36"测试文字1"out wout 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(chineseref rectsurfacePtrref 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(chineseref rectsurfacePtrref 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(surfacePtrxsys, 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.wrect.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文字和图形 - 海龙 - 海龙的博客

     

    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

  • 相关阅读:
    反垃圾邮件技术已转移到云计算中 狼人:
    被黑客NeoN“附体” QQ为推产品谎报漏洞 狼人:
    360到底如何判断泄密的? 狼人:
    Orkut 也遭到 XSS 攻击,18 万用户受影响 狼人:
    僵尸网络产生的垃圾邮件占全球的40% 狼人:
    Stuxnet病毒全球肆虐 将影响我国众多企业 狼人:
    地狱黑客给你的十大网络安全防范建议 狼人:
    微博疯传电脑提速“秘技” 360安全专家称纯属忽悠 狼人:
    微软称Google的Chrome Frame 让 IE 攻击翻倍 狼人:
    陈天桥:欣赏360保护隐私 用户安全永远第一 狼人:
  • 原文地址:https://www.cnblogs.com/jhlong/p/5433846.html
Copyright © 2011-2022 走看看