首页 > 代码库 > Cocos2d-x3.0 不规则Button

Cocos2d-x3.0 不规则Button

这是我参照之前在iOS项目中用过的一个不规则形状按钮的第三方Button,这里用Cocos2d-x实现一个相似功能的按钮。

原文地址:http://blog.csdn.net/qqmcy/article/details/26161339

代码下载:http://download.csdn.net/detail/qqmcy/7365843

使用方法:

.h

//
//  TestScene.h
//  maptest
//
//  Created by 杜甲 on 14-5-18.
//
//

#ifndef __maptest__TestScene__
#define __maptest__TestScene__

#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "DJShapeButton.h"
USING_NS_CC;



class TestScene :public Layer,public DJShapeButtonDelegate{
    
public:
    static Scene* createScene();
    virtual bool init();
    
    CREATE_FUNC(TestScene);
    void buttonCallBack(DJShapeButton* sender);
    
};

#endif /* defined(__maptest__TestScene__) */



        DJShapeButton* djShapeBtn  = DJShapeButton::create("res/red/1300_r.png");
        djShapeBtn->setDelegate(this);
        //设置tag
        djShapeBtn->setShapeBtnTag(1000);
        djShapeBtn->setPosition(Point(0, 40));
        addChild(djShapeBtn);


回调函数
void TestScene::buttonCallBack(DJShapeButton *sender)
{
    log("%d",sender->getTag());
}



DJShapeButton.h不规则形状Button类

//
//  DJShapeButton.h
//  maptest
//
//  Created by 杜甲 on 14-5-18.
//
//

#ifndef __maptest__DJShapeButton__
#define __maptest__DJShapeButton__

class DJShapeButton;

class DJShapeButtonDelegate {
    
public:
    virtual void buttonCallBack(DJShapeButton* sender) = 0;
    
    
};

#include "cocos2d.h"
#include "ui/CocosGUI.h"


USING_NS_CC;

class DJShapeButton :public ui::Layout{
    
public:
    static DJShapeButton* create(const std::string& normalImage);
    
    CC_SYNTHESIZE(DJShapeButtonDelegate*, _delegateBtn, Delegate);
    
    
    
    virtual bool init(const std::string& normalImage);
    
    CC_SYNTHESIZE_RETAIN(Sprite*,  shapeBtn, ShapeBtn);
    
    void setShapeBtnTag(int tag);
private:
    bool isSwallow ;
    
    
    
};


#endif /* defined(__maptest__DJShapeButton__) */

DJShapeButton.cpp

//
//  DJShapeButton.cpp
//  maptest
//
//  Created by 杜甲 on 14-5-18.
//
//

#include "DJShapeButton.h"
DJShapeButton* DJShapeButton::create(const std::string &normalImage)
{
    DJShapeButton *pRet = new DJShapeButton();
    if (pRet && pRet->init(normalImage))
    {
        pRet->autorelease();
        return pRet;
    }
    else
    {
        delete pRet;
        pRet = NULL;
        return NULL;
    }

}
bool DJShapeButton::init(const std::string &normalImage)
{
    bool bRet = false;
    do {
        CC_BREAK_IF(!ui::Layout::init());
        
        
        
        Image* myImg = new Image();
        myImg->initWithImageFile(normalImage);
        
        
        
        
        Texture2D* temp = new Texture2D();
        temp->initWithImage(myImg);
        
        shapeBtn =Sprite::createWithTexture(temp);
        
        log("%f,%f",shapeBtn->getAnchorPoint().x ,shapeBtn->getAnchorPoint().y);
        log("width = %f,height = %f",shapeBtn->getContentSize().width , shapeBtn->getContentSize().height);
        
        addChild(shapeBtn);
        
        
        
        this->setSize(shapeBtn->getContentSize());
        shapeBtn->setPosition(Point(getSize().width / 2, getSize().height / 2));
        
        auto listener1 = EventListenerTouchOneByOne::create();
        
        listener1->onTouchBegan = [=](Touch* touch, Event* event)
        {
            auto target = static_cast<Sprite*>(event->getCurrentTarget());
            Point locationInNode = target->convertToNodeSpace(touch->getLocation());
            Color4B c = {0,0,0,0};
            
            Point pt = Point(locationInNode.x, target->getContentSize().height - locationInNode.y);
            
            
            
            Size s = target->getContentSize();
            Rect rect = Rect(0, 0, s.width, s.height);
            
            if (rect.containsPoint(locationInNode)) {
                log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);
                
                
                
                unsigned int x = pt.x, y = pt.y;
                unsigned char* data = http://www.mamicode.com/myImg->getData();>