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

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事件,加入自己的效果。

  1. bool MyMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)  
  2. {  
  3.     CC_UNUSED_PARAM(event);  
  4.     if (m_eState != kCCMenuStateWaiting || ! m_bIsVisible)  
  5.     {  
  6.         return false;  
  7.     }  
  8.       
  9.     for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())  
  10.     {  
  11.         if (c->getIsVisible() == false)  
  12.         {  
  13.             return false;  
  14.         }  
  15.     }  
  16.       
  17.     m_pSelectedItem = this->itemForTouch(touch);  
  18.     if (m_pSelectedItem)  
  19.     {  
  20.         m_eState = kCCMenuStateTrackingTouch;  
  21.         m_pSelectedItem->selected();  
  22.         //这里加入自己想要的效果。。。。。。。。。。。。。。。。   
  23.         return true;  
  24.     }  
  25.     return false;  
  26. }  
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

  1. MyMenu * MyMenu::menuWithItems(CCMenuItem* item, ...)  
  2. {  
  3.     va_list args;  
  4.     va_start(args,item);  
  5.     MyMenu *pRet = new MyMenu();//这里记得要注意  
  6.     if (pRet && pRet->initWithItems(item, args))  
  7.     {  
  8.         pRet->autorelease();  
  9.         va_end(args);  
  10.         return pRet;  
  11.     }  
  12.     va_end(args);  
  13.     CC_SAFE_DELETE(pRet)  
  14.     return NULL;  
  15. }  
  16.   
  17. MyMenu* MyMenu::menuWithItem(CCMenuItem* item)  
  18. {  
  19.     return menuWithItems(item, NULL);  
  20. }  
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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值