编写具有文字效果的按钮

编写步骤

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;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值