cocos2d-x CCMenuItem自动排列

//使用说明:
/*get the size of background, otherwise the menu content size will be set as WinSize
menuPurchase->setContentSize(CCSizeMake(backSize.width,backSize.height));
menuPurchase->alignItemsToCenterWithTopPadding(20);*/
//CCMenu的自动排列不大好用,排列效果不理想,所以自定义了个CCMenu,使得更人性化,大家可以在这基础上进行扩展。
//Edit By Dark
#ifndef __PurchaseMenu_H_
#define __PurchaseMenu_H_
#include "cocos2d.h" 
USING_NS_CC;

#define USING_NS_PURCHASE_MENU using namespace puchase_menu

static int kDefaultPadding = 5;

namespace puchase_menu{

class   PurchaseMenu : public CCMenu{

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


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

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

	virtual void draw();

	//align
	void alignItemsVerticallyToCenter(void);
	void alignItemsVerticallyToCenterWithPadding(float padding);
	void alignItemsToCenter(void);
	void alignItemsToCenterWithPadding(float itemPadding,float topPadding);
	void alignItemsToCenterWithTopPadding(float topPadding);

};
}
#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();  //key point
	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);
}

    /** Override this method to draw your own node.
     The following GL states will be enabled by default:
     - glEnableClientState(GL_VERTEX_ARRAY);
     - glEnableClientState(GL_COLOR_ARRAY);
     - glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     - glEnable(GL_TEXTURE_2D);

     AND YOU SHOULD NOT DISABLE THEM AFTER DRAWING YOUR NODE

     But if you enable any other GL state, you should disable it after drawing your node.
     */
void PurchaseMenu::draw(){

	//default
}


void PurchaseMenu::alignItemsVerticallyToCenter(void)
{
	this->alignItemsVerticallyToCenterWithPadding(kDefaultPadding);
}

void PurchaseMenu::alignItemsVerticallyToCenterWithPadding(float padding)
{

	float total_height = -padding;
	if (m_pChildren && m_pChildren->count() > 0)
	{
		CCObject* pObject = NULL;
		CCARRAY_FOREACH(m_pChildren, pObject)
		{
			CCNode* pChild = dynamic_cast<CCNode*>(pObject);
			if (pChild)
			{
				total_height += pChild->getContentSize().height * pChild->getScaleY() + padding;
			}
		}
	}

	float y = total_height / 2.0f;
	if (m_pChildren && m_pChildren->count() > 0)
	{
		CCObject* pObject = NULL;
		CCARRAY_FOREACH(m_pChildren, pObject)
		{
			CCNode* pChild = dynamic_cast<CCNode*>(pObject);
			if (pChild)
			{
				CCSize menuSize = this->getContentSize();
				 
				pChild->setPosition(ccp(menuSize.width/2, y - pChild->getContentSize().height * pChild->getScaleY() / 2.0f));
				y -= pChild->getContentSize().height * pChild->getScaleY() + padding;
			}
		}
	}
}


void PurchaseMenu::alignItemsToCenter(void){
	this->alignItemsToCenterWithPadding(kDefaultPadding,kDefaultPadding);
}

void PurchaseMenu::alignItemsToCenterWithPadding(float paddingBetweenItem,float paddingFromTop ){
	float total_height = -paddingBetweenItem;
	CCSize menuSize = this->getContentSize();

	if (m_pChildren && m_pChildren->count() > 0)
	{
		CCObject* pObject = NULL;
		CCARRAY_FOREACH(m_pChildren, pObject)
		{
			CCNode* pChild = dynamic_cast<CCNode*>(pObject);
			if (pChild)
			{
				total_height += pChild->getContentSize().height * pChild->getScaleY() + paddingBetweenItem;
			}
		}
	}

	float y = total_height / 2.0f + menuSize.height/2.0f - paddingFromTop;
	if (m_pChildren && m_pChildren->count() > 0)
	{
		CCObject* pObject = NULL;
		CCARRAY_FOREACH(m_pChildren, pObject)
		{
			CCNode* pChild = dynamic_cast<CCNode*>(pObject);
			if (pChild)
			{
				 
				pChild->setPosition(ccp(menuSize.width/2, y - pChild->getContentSize().height * pChild->getScaleY()));
				y -= pChild->getContentSize().height * pChild->getScaleY() + paddingBetweenItem;
			}
		}
	}
}


void PurchaseMenu::alignItemsToCenterWithTopPadding(float paddingOfTop){
	 alignItemsToCenterWithPadding(kDefaultPadding,paddingOfTop);
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值