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)輸出"你"。太不可思議了,我還是第一次見到三字節編碼,不知道其

內部如何實現,有知道的大俠請不吝告知。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM