转自:http://blog.csdn.net/yhhwatl/article/details/26487731
从今天开始 咱也模仿 红孩儿这些大牛分析源码 ,由于水平有限 不对之处欢迎狂喷。哈哈。
- #ifndef__UIWIDGET_H__
- #define__UIWIDGET_H__
- #include"ui/CCProtectedNode.h"
- #include"ui/UILayoutDefine.h"
- #include"ui/UILayoutParameter.h"
- #include"ui/GUIDefine.h"
- NS_CC_BEGIN
- namespaceui{
- typedefenum
- {
- BRIGHT_NONE=-1,
- BRIGHT_NORMAL,//正常
- BRIGHT_HIGHLIGHT//高亮按钮点击之后
- }BrightStyle;//明亮的风格
- enum
- {
- WidgetTypeWidget,119)">//control基本UIWidget默认
- WidgetTypeContainer//container容器layout实例化
- }WidgetType;//ui类型
- enum
- {
- UI_TEX_TYPE_LOCAL=0,119)">//meanslocalfile
- UI_TEX_TYPE_PLIST=1//meansspriteframe
- }TextureResType;//贴图类型
- enumclassTouchEventType
- {
- TOUCH_EVENT_BEGAN,119)">//开始
- TOUCH_EVENT_MOVED,119)">//移动
- TOUCH_EVENT_ENDED,119)">//结束
- TOUCH_EVENT_CANCELED//取消
- };//触摸事件类型
- enum
- {
- SIZE_ABSOLUTE,119)">//绝对值
- SIZE_PERCENT//百分比值
- }SizeType;//size值类型
- enum
- {
- POSITION_ABSOLUTE,119)">//绝对真实位置
- POSITION_PERCENT//相对父节点位置百分比
- }PositionType;//位置类型
- enum
- {
- WIDGET_SIZE,119)">//size
- WIDGET_POSITION//position
- }WidgetInfoType;//位置类型
- //哦这里说明一下回调函数被我修改了下主要是这样修改之后可以用到C++11的lambda表达式
- //不必在使用的时候多声明一个回调函数了比较方便希望引擎组可以采用这种方式。
- typedefstd::function<void(Ref*,TouchEventType)>SEL_TouchEvent;
- //函数指针指向返回值void参数列表(Ref*,TouchEventType)类型的函数
- //typedefvoid(Ref::*SEL_TouchEvent)(Ref*,TouchEventType);
- //宏定义给函数指针SEL_TouchEvent取别名为toucheventselector
- #definetoucheventselector(_SELECTOR)(SEL_TouchEvent)(&_SELECTOR)
- classWidget:publicProtectedNode
- {
- public:
- Widget(void);
- virtual~Widget();
- staticWidget*create();
- /**设置是否触摸&&可见默认true*/
- virtualvoidsetEnabled(boolenabled);
- boolisEnabled()const;
- /**设置是否明亮默认true*/
- voidsetBright(boolbright);
- /**是否明亮*/
- boolisBright()/**是否可以触摸(响应事件)默认true*/
- voidsetTouchEnabled(boolenabled);
- /**设置明亮风格正常or明亮默认正常*/
- voidsetBrightStyle(BrightStylestyle);
- /**是否可以触摸*/
- boolisTouchEnabled()/**是否被选中默认false*/
- boolisFocused()/**是否被选中默认false*/
- voidsetFocused(boolfucosed);
- /**获取此控件距离左节点的下边界长度*/
- floatgetLeftInParent();
- /**获取此控件距离父节点的下边界长度*/
- floatgetBottomInParent();
- /**获取此控件距离父节点的右边界长度*/
- floatgetRightInParent();
- /**获取此控件距离父节点的上边界长度*/
- floatgetTopInParent();
- /**获取一个孩子从容器根据它的名字*/
- virtualWidget*getChildByName(constchar*name);
- /**渲染重载*/
- voidvisit(cocos2d::Renderer*renderer,constkmMat4&parentTransform,boolparentTransformUpdated)override;
- /**添加回调事件*/
- voidaddTouchEventListener(SEL_TouchEventselector);
- /**打印属性debug*/
- voidlogInfo(WidgetInfoType_type);
- //cocos2d属性
- /**
- 基类有的函数为virtual有的不是
- 不带virtual的是所有子类都拥有这个函数的功能。
- 带virtual的是拥有上述功能之外重载父类的函数想拓展功能用的。
- 带virtual的函数可以使用多态即父类指针指向子类成员
- */
- /**
- *更改在OpenGL坐标系中widget的位置(X,Y)
- *原来的点(0,0)是在屏幕的左下角。
- *@参数位置在OpenGL坐标widget的位置(X,Y)
- */
- voidsetPosition(constPoint&pos)override;
- /**同上绝对位置变为百分比*/
- voidsetPositionPercent(constPoint&percent);
- /**得到在OpenGL坐标系中widget的百分比位置(X,Y)*/
- constPoint&getPositionPercent();
- /**设置位置类型*/
- voidsetPositionType(PositionTypetype);
- /**得到位置类型*/
- PositionTypegetPositionType()const;
- /**设置该widget是否水平翻转*/
- voidsetFlippedX(boolflippedX);
- /**该widget是否水平翻转*/
- virtualboolisFlippedX(){return_flippedX;};
- /**该widget是否垂直翻转*/
- voidsetFlippedY(boolflippedY);
- /**该widget是否垂直翻转*/
- boolisFlippedY(){return_flippedY;};
- /**设置颜色*/
- voidsetColor(constColor3B&color)override;
- /**设置透明度*/
- voidsetOpacity(GLubyteopacity)override;
- /**得到颜色值*/
- constColor3B&getColor()constoverride{return_color;};
- /**得到透明度*/
- GLubytegetOpacity()return_opacity;};
- /**弃用的属性*/
- /**@deprecatedUseisFlippedX()instead*/
- CC_DEPRECATED_ATTRIBUTEboolisFlipX(){returnisFlippedX();};
- /**@deprecatedUsesetFlippedX()instead*/
- CC_DEPRECATED_ATTRIBUTEvoidsetFlipX(boolflipX){setFlippedX(flipX);};
- /**@deprecatedUseisFlippedY()instead*/
- CC_DEPRECATED_ATTRIBUTEboolisFlipY(){returnisFlippedY();};
- /**@deprecatedUsesetFlippedY()instead*/
- CC_DEPRECATED_ATTRIBUTEvoidsetFlipY(boolflipY){setFlippedY(flipY);};
- /**当该widget失去焦点会调用*/
- voiddidNotSelectSelf();
- /**检查一个点是否在父节点区域*/
- boolclippingParentAreaContainPoint(constPoint&pt);
- /**发送触摸事件到widget的父节点*/
- voidcheckChildInfo(inthandleState,Widget*sender,255); font-weight:bold">constPoint&touchPoint);
- /**Getsthetouchbeganpointofwidgetwhenwidgetisselected.*/
- constPoint&getTouchStartPos();
- /**Getsthetouchmovepointofwidgetwhenwidgetisselected*/
- constPoint&getTouchMovePos();
- /**Getsthetouchendpointofwidgetwhenwidgetisselected.*/
- constPoint&getTouchEndPos();
- /**设置name*/
- voidsetName(char*name);
- /**得到name*/
- char*getName()const;
- /**得到控件类型*/
- WidgetTypegetWidgetType()/**设置控件大小*/
- voidsetSize(constSize&size);
- voidsetSizeW(int&sizeW);
- voidsetSizeH(int&sizeH);
- /**设置size百分比*/
- voidsetSizePercent(constPoint&percent);
- /**size类型*/
- voidsetSizeType(SizeTypetype);
- /**得到size类型*/
- SizeTypegetSizeType()/**得到size*/
- constSize&getSize()/**得到Customsize*/
- constSize&getCustomSize()/**得到layoutsize*/
- constSize&getLayoutSize(){return_size;};//虚函数供子类重写?
- /**得到size百分比*/
- constPoint&getSizePercent()/***/
- boolhitTest(constPoint&pt);
- /**触摸事件*/
- boolonTouchBegan(Touch*touch,Event*unusedEvent);
- voidonTouchMoved(Touch*touch,Event*unusedEvent);
- voidonTouchEnded(Touch*touch,255); font-weight:bold">voidonTouchCancelled(Touch*touch,Event*unusedEvent);
- /**设置布局参数*/
- voidsetLayoutParameter(LayoutParameter*parameter);
- /**得到布局参数*/
- LayoutParameter*getLayoutParameter(LayoutParameterTypetype);
- /**是否忽略size使用texturesize默认true*/
- voidignoreContentAdaptWithSize(boolignore);
- /**是否忽略size使用texturesize*/
- boolisIgnoreContentAdaptWithSize()/**得到世界位置*/
- PointgetWorldPosition();
- /**得到虚拟渲染器例如一个button的虚拟渲染器是他的texturerenderer贴图渲染器*/
- virtualNode*getVirtualRenderer();
- /**得到虚拟渲染器的size默认是_contentSize不同的子类有自己的重载*/
- constSize&getVirtualRendererSize()const;
- *得到改控件对应的"classname".
- virtualstd::stringgetDescription()constoverride;
- /**克隆替身*/
- Widget*clone();
- voidonEnter()override;
- voidonExit()override;
- /**更新size和position*/
- voidupdateSizeAndPosition();
- voidupdateSizeAndPosition(constSize&parentSize);
- /*tempaction*/
- voidsetActionTag(inttag);
- intgetActionTag();
- CC_CONSTRUCTOR_ACCESS:
- //initializesstateofwidget.
- boolinit()override;
- protected:
- //callbackfunctioncalledwhensizechanged.
- voidonSizeChanged();
- //initializesrendererofwidget.
- voidinitRenderer();
- //回复正常调用.
- voidonPressStateChangedToNormal();
- //选中会调用
- voidonPressStateChangedToPressed();
- //变暗会调用
- voidonPressStateChangedToDisabled();
- //不同的事件
- voidpushDownEvent();
- voidmoveEvent();
- voidreleaseUpEvent();
- voidcancelUpEvent();
- //空的虚函数为了多态
- voidupdateTextureColor(){};
- voidupdateTextureOpacity(){};
- voidupdateTextureRGBA(){};
- voidupdateFlippedX(){};
- voidupdateFlippedY(){};
- voidupdateColorToRenderer(Node*renderer);
- voidupdateOpacityToRenderer(Node*renderer);
- voidupdateRGBAToRenderer(Node*renderer);
- voidcopyProperties(Widget*model);
- virtualWidget*createCloneInstance();
- voidcopySpecialProperties(Widget*model);
- voidcopyClonedWidgetChildren(Widget*model);
- Widget*getWidgetParent();
- voidupdateContentSizeWithTextureSize(constSize&size);
- /**多态适用于所有的子类重载实现自己的逻辑*/
- voidadaptRenderers(){};
- protected:
- bool_enabled;///<是否可见&&可触摸最高属性
- bool_bright;///<是否光亮
- bool_touchEnabled;///<是否响应触摸
- bool_touchPassedEnabled;///<触摸时间是不是按下
- bool_focus;///<是不是焦点
- BrightStyle_brightStyle;///<明亮风格
- Point_touchStartPos;///<touchbeganpoint
- Point_touchMovePos;///<touchmovedpoint
- Point_touchEndPos;///<touchendedpoint
- SEL_TouchEvent_touchEventSelector;///回调函数类型
- std::string_name;///类名
- WidgetType_widgetType;///控件类型
- int_actionTag;///执行动作的tag
- Size_size;///untransformedsize
- Size_customSize;///自定义size
- bool_ignoreSize;///是否忽略自定义的大小而取资源原本的大小untransformedimgsize默认_size=_customSize
- bool_affectByClipping;
- SizeType_sizeType;///size类型
- Point_sizePercent;///相对父节点size百分比
- PositionType_positionType;///位置类型
- Point_positionPercent;///相对父节点的位置百分比
- bool_reorderWidgetChildDirty;
- bool_hitted;
- EventListenerTouchOneByOne*_touchListener;///单点触摸
- Color3B_color;///颜色值
- GLubyte_opacity;///透明度
- bool_flippedX;//是否镜像X轴
- bool_flippedY;//是否镜像Y轴
- Map<int,LayoutParameter*>_layoutParameterDictionary;//布局参数Map
- };
- }
- NS_CC_END
- #endif/*defined(__Widget__)*/