zoukankan      html  css  js  c++  java
  • CEGUI 聊天对话框

    最近在写聊天对话框,使用CEGUI,就是游戏中左下角聊天模块,主要功能就是显示用户的名称,聊天的内容,表情,以及一些装备格式像下面这个样子

    [莫压枯枯地]:大家晚上好[表情],这是我新穿的衣服[装备].
    在此记录一下我遇到的问题及解决方案

    整个聊天列表是使用StaticText控件完成的,即,所以有聊天信息都是这个StaticText的Text属性值
    用户名,[莫压枯枯地]如果只是要求使用与聊天内容不同的字体、不同颜色的话,那就可以直接设置这段内容属性值,像这样,插入一段新的聊天内容:s

    local infoWin = CEGUI.WindowManager:getSingleton():getWindow("ChatWindow/Infolist");
    local priTxtFont = infoWin:getFont(); -- 保留原来的字体
    local priTxtColour = infoWin:getProperty("TextColours"); -- 保留原来的颜色
    local newInfo = "[font='字体'][colour='FFFF0000'][莫压枯枯地]" ..
    "[font='" .. priTxtFont .. "'][colour='" .. priTxtColour .. "']:hallow.";
    infoWin:setProperty(
    "Text", infoWin:getText() .. newInfo)
    如果是要求,鼠标放在上面有相关的事件,或者双击这个用户,编辑框中就出现这个用户的名称(表示要对这个用户说话时候),再或者要求用户的名称要有背景颜色,且不同类型的用户有不同的背景,如管理员与普通玩家的背景要求不同,还要文字的颜色可以设置不同,这个做起来有些麻烦,首先把我发现的CEGUI的问题描述一下:首先是事件,这个要插入一个控件,控件有相关的事件绑定,如鼠标放在上面,触发事件,然后出现一个消息框,描述这个玩家的一些信息,鼠标拿开,这个信息框就消失;双击这个控件,就将用户的名称追加到编辑框中;要有背景颜色,CEGUI中我还没有发现StaticText可以直接设置背景色,通过DEMO我发现它是在looknfeel文件中设置相关的图片来作为背景图片,背景的颜色也是可以在looknfeel中设置,可是如果不同背景颜色的控件都在looknfeel中使用一个单独的WidgetLook的话,那有些麻烦(突然想起来,可以将looknfeel改一下,就像StaticText的Text颜色可以设置一样,背景也可以改成通过控件的属性值来设置,待会儿试一下,明天把结果贴出来),刚才说到StaticText设置背景色,不可以直接通过属性来设置,且设置背景图片亦不可通过属性来直接设置,不过StaticImage可以通过设置背景图片来设置它的背景,而且StaticText亦可以将背景设置为透明,这样就好办了,设置一个控件,StaticImage中包含一个StaticText就OK了(StaticImage不可以设置文本所以在StaticImage中包含一个StaticText窗口,并把StaticText窗口设置为背景透明)StaticImage换背景图片很方便,只要美工给力,想怎么换都行,这样背景就有了,而StaticText可以设置文字的类型和颜色,且可以绑定事件到StaticText窗口(不是StaticImage窗口,因为StaticImage窗口已经被StaticText完整的覆盖了,所以StaticImage窗口不能直接的收到鼠标点击的消息) ,OK,背景有了,文字的类型与颜色也都有了,问题解决了,装备也是这样放置一个控件窗口来完成的,效果做的好的话,完全看不出来与其它文字有什么不同,唯一不同的是,这段文字(装备名称),可以有事件,它弹出一个信息框。还有一个问题,就是这个控件窗口的大小(高度与宽度),我现在叫[莫压枯枯地],五个字,产生的控件窗口大小要正好将这五个字放进去,其它用户的名称肯定有长有短,得动态产生这些个控件,且控件的大小要与字符串内容的宽高相符合,这个要使用Font的PointSize属性,见代码:
    function lua_computeStringWH(win, contentString) -- width && height
    local font = win:getFont();
    local ps = font:getProperty("PointSize");
    local width = string.len(contentString) * ps + 6;
    local height = ps + 6;

    return "{{0,0},{0,0},{0," .. width .. "},{0, " .. height .. "}}"
    end
    使用StaticText有下拉滚动条,发信息到聊天框的时候,滚动条它始终在上面,没有自动的往下面滚动,让玩家看到最新的消息,可以获取StaticText窗口的滚动条,发信息的时候将滚动条的位置到最下面,这样就OK了,在looknfeel文件,滚动条是作为StaticText的子控件,Child属性就是表示它是子控件,以TaharezLook/StaticText为例,有这么一行:<Child  type="TaharezLook/VerticalScrollbar" nameSuffix="__auto_vscrollbar__">这个表示,StaticText有一个子控件,类型是:"TaharezLook/VerticalScrollbar",这个子控件的名称是:"__auto_vscrollbar__",假如此时StaticText的名称为Chat/Infolist,那这个滚动条的名称就是:Chat/Infolist__auto_vscrollbar__(注意这点,它的真正名称是它的父控件的名称加这个后缀名,只有这个名称才是WindowManager可以通过它来获取这个滚动条控件),见代码:
    hscrollbarName = infoWin:getName() .. "__auto_vscrollbar__";
    hscrollbar
    = winMgr:getWindow(hscrollbarName);

    这样就得到了这个滚动条控件,你可以通过ScrollPosition这个属性来设置滚动条的位置,如hscrollbar:setProperty("ScrollPosition", "20");

    我遇到的问题基本上就这些,明天写,在聊天框中显示动态表情

  • 相关阅读:
    野指针、NULL指针和void*
    Windows获取其他进程中Edit控件的内容
    error:LNK2005 已经在*.obj中定义
    2018-2019-1 20165226 《信息安全系统设计基础》第6周学习总结
    # 2018-2019-1 20165226 《信息安全系统设计基础》第5周学习总结
    2018-2019-1 20165310 20165315 20165226 实验一 开发环境的熟悉
    2018-2019-1 20165226 《信息安全系统设计基础》第4周学习总结
    2018-2019-1 20165226 《信息安全系统设计基础》第3周学习总结
    缓冲区溢出漏洞实验
    2018-2019-1 20165226 《信息安全系统设计基础》第2周学习总结
  • 原文地址:https://www.cnblogs.com/emyueguang/p/2102604.html
Copyright © 2011-2022 走看看