cocos2d-x 新手引导(矩形,圆形的强制引导)

#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);//设置裁剪模板
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值