love2d教程25--字符流水灯
中文字符串
要想实现字符流水灯,先要实现中文字符串截取,因为在love2d里含有中文时string.sub失效。
可能学得不好吧,为了实现love2d的中文字符串截取,居然在此耗费了五六个小时。一开始
我想的是通过编写C/C++扩展来实现,于是有了c++截取汉字和英文混合字符串这篇文章。可
是等我生成dll后居然发现是乱码,以为是自己的代码问题,折腾了半天还是没有结果,后来吃
饭后回来突然想到可能是编码问题。于是在win的命令行上右键查看属性是936编码,可见cmd
是不支持utf-8的,而我的lua编码是utf-8,于是把lua文件另存为ansi码,再运行居然可以了。
当我天真的想这下应该可以截取中文字符串时,写了一个love2d的测试程序却发现还是那个错误,
decode error invalid utf8。我想难道是我的工程要设为UNICODE,于是又改为UNICODE,还是
如此。
后来,冷静的想了一下,觉得可能不是我的代码的问题,在lua里中文截取是没问题的,可是在
love2d里却又问题,这是什么原因呢。lua是用纯C实现的,既然如此我调用C++/C的字符串函数
与在lua里调用lua的字符串函数应该是等效的,那我通过C/C++里的字符串函数来截取中文字符串
导出给lua后,在love2d里当然还是出错。那么自己实现一个字符串函数,开始我也这么想,可是
后来折腾了一下放弃了。
怎么办?还是用我在简单拼音输入法里的方法,利用一个lua文件把字符串转为tabel存到另一个
lua文件里。后来虽然实现了,可是发现也不好,在linux下用lua zhstr.lua生成的lua是乱码,在win
下也是如此,不过在scite里运行后生成的却是ansi正常编码的lua文件。
--字符串转table,支持中英文混排 --会在当前目录下生成talk.lua function zhstr(str,tname) local f = io.open("talk.lua", "a") local len=#str f:write(tname,"={") local i=1 while(i<len) do if string.byte(str,i,i)>127 then f:write("\"",string.sub(str,i,i+1),"\",") i=i+2 else f:write("\"",string.sub(str,i,i),"\",") i=i+1 end end f:write("}") f:write("\n") f:close() end zhstr("半山无极","talk1") zhstr("你好","talk2") zhstr("hello world","talk3")
下面说一下如何使用,把上面的代码放到scite里,zhstr函数有两个参数
第一个是待转换字符串,支持中英文混排,第二个是生成表后的表名。
由于采用的是附加模式读写文件,建议把你要的转换的信息都放在zhstr.lua里
使用zhstr()函数,每次修改后删除生成的talks.lua,并在scite里重新运行,
然后转换talks.lua为utf-8无bom编码。
字符流水灯
由于我们已经把字符串存为了表,实现流水灯就比较简单了,每隔一段时间
把表里的字符取出并连接就可以了。
require('talk') --说明请注意自行修改字体 --滚动文字 t字符串表,rate出现时间间隔 function rollText(t,rate) local count=0 local i=1 local str="" local function text() count=count+love.timer.getDelta() if count>rate then count=0 if i<=#t then str=str.. t[i] i=i+1 end end return str end return text end function love.load() font=love.graphics.newFont("YaHeiConsolas.ttf",48) love.graphics.setFont(font) --rollText是函数类型 roll=rollText(talk1,0.3) end function love.draw() str=roll() love.graphics.print(str,100,100) end
效果如图,代码点击下载。 当然这只是暂时之法,等以后我把Qt熟悉后,写一个对话编译器。
2013-4-14修正,love里string.sub()对中文可以支持,但是居然一个中文占3个字节,即
string.sub("你好",1,3)输出"你"。太不可思议了,我还是第一次见到三字节编码,不知道其
内部如何实现,有知道的大侠请不吝告知。
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。