有了之前的文字滾動顯示,現在我們在其基礎上與loveframes結合創建一個對話條,先上
效果圖.
逐行顯示
逐字顯示
功能簡介,支持事件回調(不過由於我把回調的判斷放到了update里所以回調不支持繪圖操作)、支持
中英文混排、支持多頁顯示、本頁結束后空格鍵翻頁、所有顯示結束后esc推出,調用也很簡單,如下
msg:add{msg={"hello\n歡迎來到我的博客\n希望和大家一同進步",
"有問題可以給我留言,一同討論"},mode="wd",fun=function() print("msg is over") end}
其中add函數的參數意義為:對話內容表(msg={})、顯示模式(mode)、回調函數(fun=)。
對話內容表里的每一項為字符串類型表示一頁,你可以在每一項里使用"\n"來換行。
顯示模式默認為逐行顯示可以為空,回調函數也可以為空。
下面說一下思路,先用loveframes里的panel+text創建一個用於顯示的面板,不過顯示的顏色不對,那我
們直接修改一下panel的皮膚即可,打開loveframes(有個skin目錄)的blue皮膚,修改80行的
skin.controls.panel_body_color為{154,210,211, 255},就是上圖的顏色了。
現在把panel+text都放在一個message類里,由於有許多屬性需要控制因此變量比較多,如message屬性
的一些默認值
message={fh=basicfont:getHeight(),curPage=1,count=1,rate=0.1,st=0,curStr="",
isEnd=false,isShow=true,isOver=false,onOver=function()end}。
逐字顯示的原理和之前的一樣,這里就不說了。逐行顯示則是手動統計msg={}里字符串里"\n"的
個數來計算行數,還要與selectbox控件結合,根據不同的行數來設置selectbox里邊界,其中用到
了字符串分割函數spilt(返回一個字符串表t,通過#t,可以得到行數),我放到了misc.lua里。
代碼不貼了自己修改字體設置,點擊下載。
附:本文代碼有點問題,在按鍵處理放錯地方了,由於時間有限,下面是簡易修改辦法,
把message.lua里的lineUpdate函數開頭的這幾行修改一下,增加按鍵防抖
local delta_t=0 --按鍵防抖計時 function message:lineUpdate(dt) self.id=self.select:GetId() if self.id==self.ln and love.keyboard.isDown(" ") then --按鍵防抖 delta_t=delta_t+dt if delta_t<0.1 then return else delta_t=0 end --0.1可以自己適當修改 self.curPage=self.curPage+1 --把光標移至第一行 for i=1,self.id-1 do self.select:Move("up") end end
最好的辦法是把按鍵檢測移到love.keypressed。估計其它地方也有此類問題,大家注意一下,
有問題請留言,不過現在時間較少,一周才能回復。