像素级触摸

像素级触摸的意义:

可以判断触摸点的RGBA值,根据A值可以判断触摸的位置是否为透明区域,这样就可以判断不规则区域的点击了。

像素级触摸的实现:

例如我们在程序init的时候,添加了一个图片在layer中,想要判断触摸的位置的像素以及透明度

bool HelloWorld::init()

{

    CCSize gWinsize = CCDirector::sharedDirector()->getWinSize();

    m_sprite = CCSprite::create("adt.png");

    m_sprite->setPosition(ccp(gWinsize.width/2,gWinsize.height/2));

    this->addChild(m_sprite);

    this->setTouchEnabled(true);

    return true;

}


bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)

{

//判断点击区域是否在所添加的图片之中

    CCPoint pos = pTouch->getLocation();

    if (m_sprite->boundingBox().containsPoint(pos))

    {

        ccColor4B c = {0, 0, 0, 0};

//将点击的位置转化为图片下的坐标,用于判断像素点的位置

        m_pos = m_sprite->convertTouchToNodeSpace(pTouch);

        //CCLog("m_pos is %f,%f",m_pos.x,m_pos.y);

//这句是关键,为了获取点击的位置所在图片中的像素点,y需要做一个相减的操作。好像是因为画布画出来的是Y轴翻转后的,测试确实应该相减,但是将画布添加的layer中,发现没有翻转,这点不太明白。

        unsigned int x = m_pos.x, y = m_sprite->getContentSize().height - m_pos.y;

//按照图片的大小新建画布,默认锚点0,0.默认坐标屏幕左下角

        CCRenderTexture* texture = CCRenderTexture::create(m_sprite->getContentSize().width, m_sprite->getContentSize().height, kCCTexture2DPixelFormat_RGBA8888);

        //使用图片新建纹理,并且设置其位置,使之与画布重合,这样才能画出来完整的图片

        CCSprite* spriteTmp = CCSprite::createWithTexture(m_sprite->getTexture());

        spriteTmp->setPosition(ccp(spriteTmp->getContentSize().width/2,spriteTmp->getContentSize().height/2));

        

        //开始画

        texture->begin();

        spriteTmp->visit();

        texture->end();

        

        //将画布中的内容取出

        CCImage* im = texture->newCCImage();

//获得了第一个像素点

        unsigned char * data = im->getData();

//获得点击位置的像素点

        unsigned int * pixel = (unsigned int*)data;

        pixel = pixel + (y * (int)m_sprite->getContentSize().width) + x;

        

//取出的即为RGBA

        c.r = *pixel & 0xff;

        c.g = (*pixel >> 8) & 0xff;

        c.b = (*pixel >> 16) & 0xff;

        c.a = (*pixel >> 24) & 0xff;

        

        CCLog("%d,%d,%d,%d",c.r,c.g,c.b,c.a);

    }

    return true;

}








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值