#ifndef __CLIPPING_NODE_MANAGER_H__
#define __CLIPPING_NODE_MANAGER_H__
#include "cocos2d.h"
/*
强制引导管理者
创建强制引导:
auto cnm = ClippingNodeManager::create();
cnm->forcedRect(矩形范围); 或 cnm->forcedRound(原点,半径);
this->addChild(cnm);
取消强制引导:
this->removeChild(cnm);
*/
//强制区域类型
enum FORCED_TYPE
{
FORCED_RECT,
FORCED_ROUND
};
class ClippingNodeManager : public cocos2d::Layer
{
public:
ClippingNodeManager();
~ClippingNodeManager();
CREATE_FUNC(ClippingNodeManager);
//设置矩形强制区域
void forcedRect(cocos2d::Rect rect);
//设置圆形强制区域
void forcedRound(cocos2d::Vec2 pos, float radius);
private:
//记录强制区域类型
int type;
//记录矩形区域
cocos2d::Rect forced;
//记录圆形原点
cocos2d::Vec2 pos;
//记录圆形半径
float radius;
cocos2d::ClippingNode *clipper;
cocos2d::EventListenerTouchOneByOne *listener;
virtual bool init();
virtual bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event);
};
#endif // !__CLIPPING_NODE_MANAGER_H__#include "GlobalInclude.h"
#include "ClippingNodeManager.h"
USING_NS_CC;
ClippingNodeManager::ClippingNodeManager()
{}
ClippingNodeManager::~ClippingNodeManager()
{}
bool ClippingNodeManager::init()
{
if(!Layer::init())
{
return false;
}
clipper = ClippingNode::create(); //创建一个ClippingNode对象
clipper->setInverted(true); //设置底板可见,显示剩余部分
clipper->setAlphaThreshold(1.0f);//设置绘制底板的Alpha值为0
this->addChild(clipper, 1);
auto layerBg = LayerColor::create(Color4B(0, 0, 0, 150));//添加了一个背景层
clipper->addChild(layerBg);
listener = EventListenerTouchOneByOne::create();//创建一个触摸监听(单点触摸)
listener->onTouchBegan = CC_CALLBACK_2(ClippingNodeManager::onTouchBegan, this);//指定触摸的回调函数
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);//将listener和layer绑定,放入事件委托中
return true;
}
bool ClippingNodeManager::onTouchBegan(Touch *touch, Event *event)
{
auto point = Director::getInstance()->convertToGL(touch->getLocationInView());//获得当前触摸的坐标
bool isInForced = false;
switch(type)
{
case FORCED_RECT:
if(forced.containsPoint(point))//如果触点处于rect中
{
listener->setSwallowTouches(false);
}
else
{
listener->setSwallowTouches(true);
}
break;
case FORCED_ROUND:
float length = point.getDistance(pos);
if(length <= radius)
{
listener->setSwallowTouches(false);
}
else
{
listener->setSwallowTouches(true);
}
break;
}
return true;
}
void ClippingNodeManager::forcedRect(Rect rect)
{
type = FORCED_RECT;
forced = rect;
const ccColor4F color = {1, 0, 0, 0};
Vec2 verts[4];
verts[0] = rect.origin;
verts[1] = Vec2(rect.origin.x, rect.origin.y + rect.size.height);
verts[2] = Vec2(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);
verts[3] = Vec2(rect.origin.x + rect.size.width, rect.origin.y);
auto drawNode = DrawNode::create();
drawNode->drawPolygon(verts, 4, color, 1, color);
clipper->setStencil(drawNode);//设置裁剪模板
}
void ClippingNodeManager::forcedRound(cocos2d::Vec2 pos, float radius)
{
type = FORCED_ROUND;
this->pos = pos;
this->radius = radius;
const ccColor4F color = {1, 0, 0, 0};
auto drawNode = DrawNode::create();
drawNode->drawDot(pos, radius, color);
clipper->setStencil(drawNode);//设置裁剪模板
}
cocos2d-x 新手引导(矩形,圆形的强制引导)
最新推荐文章于 2023-02-05 17:18:20 发布