项目开发日志(八)
今天给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; }