love2d教程26--对话条

有了之前的文字滚动显示,现在我们在其基础上与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。估计其它地方也有此类问题,大家注意一下,

有问题请留言,不过现在时间较少,一周才能回复。

 

 

posted @ 2013-04-15 21:29  半山th  阅读(1349)  评论(14编辑  收藏  举报