Cocos2d-x3.0 不规则Button

Posted mqxnongmin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = myImg->getData();
                unsigned int* pixel = (unsigned int*)data;
                pixel = pixel + (y * 116) + x;
                c.r = *pixel & 0xff;
                c.g = (*pixel >> 8 ) & 0xff;
                c.b = (*pixel >> 16) & 0xff;
                c.a = (*pixel >> 24) & 0xff;
                log("8888888888%d",c.a);
                if (c.a <= 4) {
                    isSwallow = false;
                }else
                {
                    isSwallow = true;
                    
                }
                
            }else{
                isSwallow = false;
            }
            
            listener1->setSwallowTouches(isSwallow);

            
            return isSwallow;
        };
        
        listener1->onTouchEnded =  [=](Touch* touch, Event* event)
        {
            if (_delegateBtn != nullptr) {
                _delegateBtn->buttonCallBack(this);
            }
        };
        
        
        
        _eventDispatcher->addEventListenerWithSceneGraphpriority(listener1, shapeBtn);
        
        
        
        
        
        bRet = true;
    } while (0);
    return bRet;
}

void DJShapeButton::setShapeBtnTag(int tag)
{
    shapeBtn->setTag(tag);
    setTag(tag);
    
}



以上是关于Cocos2d-x3.0 不规则Button的主要内容,如果未能解决你的问题,请参考以下文章

COCOS2D-X 3.0 文字button 不显示 或者闪动

COCOS2D-X 3.0 文字button 不显示 或者闪动

COCOS2D-X 3.0 文字button 不显示 或者闪动

COCOS2D-X 3.0 文字button 不显示 或者闪动

COCOS2D-X 3.0 文字button 不显示 或者闪动

COCOS2D-X 3.0 文字button 不显示 或者闪动