编写步骤
1.新建CJYMenuItemImage继承自MenuItemImage
2.在CJYMenuItemImage的onEnter添加一个CCLableTTF,打开级联颜色和透明度
3.在CJYMenuItemImage编写CCLableTTF放大和缩小的响应函数(比如缩小到80%),在CJYMenuItemImage编写设置文字函数
4.新建CJYMenu,继承自Menu,头文件引用CJYMenuItemImage.h
5.在touchbegan中添加CJYMenuItemImage的缩小函数,在touchend中添加CJYMenuItemImage的放大函数
6.在Layer中分别用CJYMenuItemImage和CJYMenu新建按钮,并且设置文字
7.运行成功
//
// LineCCMenuItemImage.h
// FruitLine
//
// Created by ChengJY on 14-7-4.
//
//
#ifndef __FruitLine__LineCCMenuItemImage__
#define __FruitLine__LineCCMenuItemImage__
#include "cocos2d.h"
USING_NS_CC;
class LineCCMenuItemImage : public CCMenuItemImage
{
public:
LineCCMenuItemImage();
~LineCCMenuItemImage();
static LineCCMenuItemImage * create(const char *normalImage, const char *selectedImage, const char *disabledImage, CCObject* target, SEL_MenuHandler selector);
bool initWithNormalImage(const char *normalImage, const char *selectedImage, const char *disabledImage, CCObject* target, SEL_MenuHandler selector);
bool initWithNormalSprite(CCNode* normalSprite, CCNode* selectedSprite, CCNode* disabledSprite, CCObject* target, SEL_MenuHandler selector);
virtual void onEnter();
virtual void onExit();
virtual void setSelected();
virtual void unSetSelected();
virtual void setEnabled(bool var);
void setStr(const char*str);
void setStateNormal();
void setStateClickDown();
private:
CCLabelTTF*_textLabel;
const char *_textStr;
bool _isSelected;
int _fontSize;
float _textDistance;
float _strokeWidth;
CCTextAlignment _align;
ccColor3B _textColor;
ccColor3B _strokeColor;
const char *_fontName;
};
#endif /* defined(__FruitLine__LineCCMenuItemImage__) */
//
// LineCCMenuItemImage.cpp
// FruitLine
//
// Created by ChengJY on 14-7-4.
//
//
#include "LineCCMenuItemImage.h"
LineCCMenuItemImage::LineCCMenuItemImage(){
_isSelected = false;
_textStr = NULL;
_fontSize = 48;
_textLabel = NULL;
_textDistance = 0.0;
_strokeWidth = 1.0;
_align = kCCTextAlignmentCenter;
_textColor = ccc3(255, 255, 255);
_strokeColor = ccc3(255, 255, 255);
_fontName = "";
}
LineCCMenuItemImage::~LineCCMenuItemImage(){
}
LineCCMenuItemImage* LineCCMenuItemImage::create(const char *normalImage, const char *selectedImage, const char *disabledImage, CCObject* target, SEL_MenuHandler selector)
{
LineCCMenuItemImage *pRet = new LineCCMenuItemImage();
if (pRet && pRet->initWithNormalImage(normalImage, selectedImage, disabledImage, target, selector)) {
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
bool LineCCMenuItemImage::initWithNormalImage(const char *normalImage, const char *selectedImage, const char *disabledImage, cocos2d::CCObject *target, SEL_MenuHandler selector)
{
CCNode *normalSprite = NULL;
CCNode *selectedSprite = NULL;
CCNode *disabledSprite = NULL;
if (normalImage)
{
normalSprite = CCSprite::create(normalImage);
}
if (selectedImage)
{
selectedSprite = CCSprite::create(selectedImage);
}
if(disabledImage)
{
disabledSprite = CCSprite::create(disabledImage);
}
return initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, target, selector);
}
bool LineCCMenuItemImage::initWithNormalSprite(CCNode* normalSprite, CCNode* selectedSprite, CCNode* disabledSprite, CCObject* target, SEL_MenuHandler selector)
{
CCMenuItem::initWithTarget(target, selector);
setNormalImage(normalSprite);
setSelectedImage(selectedSprite);
setDisabledImage(disabledSprite);
if(m_pNormalImage)
{
this->setContentSize(m_pNormalImage->getContentSize());
}
setCascadeColorEnabled(true);
setCascadeOpacityEnabled(true);
return true;
}
void LineCCMenuItemImage::setStr(const char*str){
// _textLabel->setString(str);
_textStr = str;
}
void LineCCMenuItemImage::onEnter(){
CCMenuItemImage::onEnter();
if (_textStr!= NULL) {
_textLabel = CCLabelTTF::create(_textStr, _fontName, _fontSize,CCSize(getContentSize().width, getContentSize().height), _align,kCCVerticalTextAlignmentCenter);
float textDestance = 0;
if (_align == kCCTextAlignmentLeft) {
textDestance = _textDistance;
}else if(_align == kCCTextAlignmentRight){
textDestance = -_textDistance;
}
_textLabel->setPosition(ccp(getContentSize().width/2+textDestance,getContentSize().height/2));
_textLabel->enableStroke(_strokeColor, _strokeWidth);
_textLabel->setAnchorPoint(ccp(0.5, 0.5));
_textLabel->setColor(_textColor);
addChild(_textLabel, 2);
}
}
void LineCCMenuItemImage::onExit(){
CCMenuItemImage::onExit();
}
void LineCCMenuItemImage::setStateNormal(){
if (_textLabel) {
_textLabel->setScale(1);
}
}
void LineCCMenuItemImage::setStateClickDown(){
if (_textLabel) {
_textLabel->setScale(0.84);
}
}
void LineCCMenuItemImage::setSelected(){
_isSelected =true;
}
void LineCCMenuItemImage::unSetSelected(){
_isSelected = false;
}
void LineCCMenuItemImage::setEnabled(bool var){
CCMenuItemImage::setEnabled(var);
}
//
// LineCCMenu.h
// FruitLine
//
// Created by ChengJY on 14-7-4.
//
//
#ifndef __FruitLine__LineCCMenu__
#define __FruitLine__LineCCMenu__
#include "cocos2d.h"
USING_NS_CC;
class LineCCMenu : public CCMenu
{
private:
bool m_bEnabled;
public:
LineCCMenu();
virtual ~LineCCMenu();
virtual void onEnter();
virtual void onExit();
virtual bool isEnabled();
virtual void setEnabled(bool value);
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
virtual void ccTouchCancelled(cocos2d::CCTouch *touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
static LineCCMenu* createWithArray(cocos2d::CCArray* pArrayOfItems);
bool initWithArray(cocos2d::CCArray* pArrayOfItems);
};
#endif /* defined(__FruitLine__LineCCMenu__) */
//
// LineCCMenu.cpp
// FruitLine
//
// Created by ChengJY on 14-7-4.
//
//
#include "LineCCMenu.h"
#include "LineCCMenuItemImage.h"
using namespace cocos2d;
LineCCMenu::LineCCMenu(){
}
LineCCMenu::~LineCCMenu(){
}
void LineCCMenu::onEnter(){
CCMenu::onEnter();
setTouchEnabled(true);
}
void LineCCMenu::onExit(){
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
if (m_eState == kCCMenuStateTrackingTouch)
{
if (m_pSelectedItem)
{
m_pSelectedItem->unselected();
((LineCCMenuItemImage*)m_pSelectedItem)->setStateNormal();
m_pSelectedItem = NULL;
}
m_eState = kCCMenuStateWaiting;
}
CCMenu::onExit();
}
LineCCMenu* LineCCMenu::createWithArray(CCArray* pArrayOfItems)
{
LineCCMenu *pRet = new LineCCMenu();
if (pRet && pRet->initWithArray(pArrayOfItems))
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}
return pRet;
}
bool LineCCMenu::initWithArray(CCArray* pArrayOfItems)
{
if (CCMenu::initWithArray(pArrayOfItems))
{
m_bEnabled = true;
setTouchEnabled(true);
setCascadeColorEnabled(true);
setCascadeOpacityEnabled(true);
return true;
}
return false;
}
void LineCCMenu::registerWithTouchDispatcher()
{
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, this->getTouchPriority(), true);
}
bool LineCCMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event);
if (m_eState != kCCMenuStateWaiting || ! m_bVisible || !m_bEnabled)
{
return false;
}
for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent())
{
if (c->isVisible() == false)
{
return false;
}
}
m_pSelectedItem = this->itemForTouch(touch);
if (m_pSelectedItem)
{
m_eState = kCCMenuStateTrackingTouch;
m_pSelectedItem->selected();
((LineCCMenuItemImage*)m_pSelectedItem)->setStateClickDown();
return true;
}
return false;
}
void LineCCMenu::ccTouchEnded(CCTouch *touch, CCEvent* event)
{
CC_UNUSED_PARAM(touch);
CC_UNUSED_PARAM(event);
CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchEnded] -- invalid state");
if (m_pSelectedItem)
{
m_pSelectedItem->unselected();
((LineCCMenuItemImage*)m_pSelectedItem)->setStateNormal();
}
m_eState = kCCMenuStateWaiting;
}
void LineCCMenu::ccTouchCancelled(CCTouch *touch, CCEvent* event)
{
CC_UNUSED_PARAM(touch);
CC_UNUSED_PARAM(event);
CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchCancelled] -- invalid state");
if (m_pSelectedItem)
{
((LineCCMenuItemImage*)m_pSelectedItem)->setStateNormal();
m_pSelectedItem->unselected();
}
m_eState = kCCMenuStateWaiting;
}
void LineCCMenu::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event);
CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchMoved] -- invalid state");
CCMenuItem *currentItem = this->itemForTouch(touch);
if (currentItem != m_pSelectedItem)
{
if (m_pSelectedItem)
{
((LineCCMenuItemImage*)m_pSelectedItem)->setStateNormal();
m_pSelectedItem->unselected();
}
m_pSelectedItem = currentItem;
if (m_pSelectedItem)
{
((LineCCMenuItemImage*)m_pSelectedItem)->setStateClickDown();
m_pSelectedItem->selected();
}
}
}
bool LineCCMenu::isEnabled(){
return m_bEnabled;
}
void LineCCMenu::setEnabled(bool value){
CCMenu::setEnabled(value);
m_bEnabled = value;
}