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