您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d自定义组件|继承CCMenu或CCMenuItem

2013-06-20 12:33 453 查看
http://blog.csdn.net/yanghuiliu/article/details/6908117

参照上文,作者没有提供完整代码,调试了我好久,先看下面转载部分,也可以直接看代码

#ifndef __PurchaseMenu_H_
#define __PurchaseMenu_H_

#include "cocos2d.h"

USING_NS_CC;

#define USING_NS_PURCHASE_MENU using namespace puchase_menu

namespace puchase_menu{

class   PurchaseMenu : public CCMenu{

public:
//PurchaseMenu()
//{}
//virtual ~PurchaseMenu(){}

//dynamic methods
PurchaseMenu * menuWithItems(CCMenuItem* item, ...);
PurchaseMenu * menuWithItem(CCMenuItem* item);

//static methods
static PurchaseMenu* create();
static PurchaseMenu* create(CCMenuItem* item, ...);
static PurchaseMenu* createWithItem(CCMenuItem* item);

//void draw();
// implement the "static node()" method manually
//CREATE_FUNC(PurchaseMenu);

};
}
#endif


#include "PurchaseMenu.h"

USING_NS_CC;

USING_NS_PURCHASE_MENU;

PurchaseMenu* PurchaseMenu::menuWithItems(CCMenuItem* item, ...)
{
va_list args;
va_start(args,item);
PurchaseMenu *pRet = new PurchaseMenu();//这里记得要注意
if (pRet && pRet->initWithItems(item, args))
{
pRet->autorelease();
va_end(args);
return pRet;
}
va_end(args);
CC_SAFE_DELETE(pRet) ;
return NULL;
}

PurchaseMenu* PurchaseMenu::menuWithItem(CCMenuItem* item)
{
return menuWithItems(item, NULL);
}

PurchaseMenu* PurchaseMenu::create()
{
return PurchaseMenu::create(NULL, NULL);
}

PurchaseMenu * PurchaseMenu::create(CCMenuItem* item, ...)
{
va_list args;
va_start(args,item);
PurchaseMenu *pRet = new PurchaseMenu();
if (pRet && pRet->initWithItems(item, args))
{
pRet->autorelease();
va_end(args);
return pRet;
}
va_end(args);
CC_SAFE_DELETE(pRet);
return NULL;
}

PurchaseMenu* PurchaseMenu::createWithItem(CCMenuItem* item)
{
return PurchaseMenu::create(item, NULL);
}


转载

昨天在项目中为了写一个有特殊效果的menu,于是想想,不就是几个action吗,回调一下就ok了,的确这样实现了,关键在于这个项目中实在是灰常多的按钮,写了6、7个后,我吐血了,决定继承CCmenu,自己定义一个,这样就不用每个都写了。

原理很简单,新建一个类继承自CCMenu,重写它的touch事件,加入自己的效果。

[cpp]
view plaincopyprint?

bool MyMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event);
if (m_eState != kCCMenuStateWaiting || ! m_bIsVisible)
{
return false;
}

for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
{
if (c->getIsVisible() == false)
{
return false;
}
}

m_pSelectedItem = this->itemForTouch(touch);
if (m_pSelectedItem)
{
m_eState = kCCMenuStateTrackingTouch;
m_pSelectedItem->selected();
//这里加入自己想要的效果。。。。。。。。。。。。。。。。

return true;
}
return false;
}

bool MyMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event);
if (m_eState != kCCMenuStateWaiting || ! m_bIsVisible)
{
return false;
}

for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
{
if (c->getIsVisible() == false)
{
return false;
}
}

m_pSelectedItem = this->itemForTouch(touch);
if (m_pSelectedItem)
{
m_eState = kCCMenuStateTrackingTouch;
m_pSelectedItem->selected();
//这里加入自己想要的效果。。。。。。。。。。。。。。。。
return true;
}
return false;
}

还没有结束,我想要的是让menu里面的item有特效,那么我还应该重写它的menuWithItems方法。

一定要记得改变他的初始化方法,原来的初始化方法返回的是系统的CCMenu,要自己改为返回自己定义的Menu

[cpp]
view plaincopyprint?

MyMenu * MyMenu::menuWithItems(CCMenuItem* item, ...) { va_list args; va_start(args,item); MyMenu *pRet = new MyMenu();//这里记得要注意 if (pRet && pRet->initWithItems(item, args)) { pRet->autorelease(); va_end(args); return pRet; } va_end(args); CC_SAFE_DELETE(pRet) return NULL; } MyMenu* MyMenu::menuWithItem(CCMenuItem* item) { return menuWithItems(item, NULL); }

MyMenu * MyMenu::menuWithItems(CCMenuItem* item, ...)
{
va_list args;
va_start(args,item);
MyMenu *pRet = new MyMenu();//这里记得要注意
if (pRet && pRet->initWithItems(item, args))
{
pRet->autorelease();
va_end(args);
return pRet;
}
va_end(args);
CC_SAFE_DELETE(pRet)
return NULL;
}

MyMenu* MyMenu::menuWithItem(CCMenuItem* item)
{
return menuWithItems(item, NULL);
}


这样你可以自己随意改变里面的m_pSelectedItem,要什么效果,自己写咯。

原创文章,欢迎转载。转载请注明地址:http://blog.csdn.net/yanghuiliu/article/details/6908117
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: