2dx增加GUI控件

项目开发日志(八)

今天给cocos2dx2.2.3的cocostudio GUI增加遮罩控件,发现步骤还挺多.这里记录一下(省去编写代码的部分):

增加控件相关pkg文件

代码编写完成后,我把代码放到extensions\CocoStudio\GUI文件夹下.这个文件夹是cocostudio用来存放UI控件的默认文件夹.然后在文件夹tools\tolua++中增加控件pkg文件,例如我增加了UIBigMap.pkg,把需要导出给外界使用的函数从控件头文件中复制到pkg中.pkg的写法参照同文件夹下的其他pkg.

修改basic_cocostudio.lua代码

在basic_cocostudio.lua文件的CCObjectTypes数组中增加我们的控件名称例如我的:

local CCObjectTypes = {
    ...,
    "UIBigMap",
    ...,
}

在cocostudio.pkg中增加pkg文件引用

需要把我们的控件pkg文件加入到cocostudio.pkg中,例如:

$#include "LuaCocoStudio.h"
...
$pfile "UIBigMap.pkg"
...

执行build_cocostudio.bat

这个时候执行tulua++文件夹下的脚本文件build_cocostudio.bat生成LuaCocoStudio.cpp

复制 LuaCocoStudio.cpp 到 lua\cocos2dx_support

把上一步生成的LuaCocoStudio.cpp复制到文件夹lua\cocos2dx_support中导出给lua使用.

cocosGUI.h头文件中增加控件引用

需要在这个头文件中增加include,例如:

...
#include "../BigMap/UIBigMap.h"
...

如果不加,会引发控件找不到的错误.

遇到的问题

由于GUI的触摸处理全部走TouchGroup的流程,所以在控件中使用addChild千万要小心,如果控件增加的节点不希望侦听触摸事件或者不是Widget类型的对象,则应该使用如下的方式增加:

//m_pBigMapNode 为我加在控件之上的节点,不需要交互
CCNode::addChild( m_pBigMapNode,0,0);

或者修改UILayout的addChild,通过C++的类型限制特性 限制Layout的addChild只能加Widget类型的对象.

//UILayout类 的addChild修改为一下方式
void Layout::addChild(Widget *child)
{
    Widget::addChild(child);
}

void Layout::addChild(Widget * child, int zOrder)
{
    Widget::addChild(child, zOrder);
}

void Layout::addChild(Widget *child, int zOrder, int tag)
{
    supplyTheLayoutParameterLackToChild(static_cast(child));
    Widget::addChild(child, zOrder, tag);
    _doLayoutDirty = true;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注