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)输出"你"。太不可思议了,我还是第一次见到三字节编码,不知道其

内部如何实现,有知道的大侠请不吝告知。

posted @ 2013-04-12 22:21  半山无极  阅读(1233)  评论(7编辑  收藏