Cocos2dx 3.17.2 获取图片中某个元素点的RGBA,并判断是否透明

本文介绍了一个名为zSprite的Cocos2d-x精灵类,该类通过创建RenderTexture并使用getSpriteFrame方法获取精灵帧,实现了判断触摸点是否在精灵纹理上的功能。通过将触摸坐标转换为节点空间坐标,再利用RenderTexture渲染精灵到内存中,然后读取该位置的像素颜色,判断其透明度来确定是否触碰到了精灵。

zSprite.h

class zSprite : public Sprite {
public:
    static zSprite* create(const std::string& filename);
    bool isTouchTexture(Vec2 worldPoint);
};

zSprite.cpp

zSprite* zSprite::create(const std::string &filename)
{
    auto sprite = new (std::nothrow) zSprite();
    if (sprite && sprite->initWithFile(filename))
    {
        sprite->autorelease();
        return sprite;
    }
    CC_SAFE_DELETE(sprite);
    return nullptr;
}

bool zSprite::isTouchTexture(Vec2 worldPoint)
{
    Vec2 position = convertToNodeSpace(worldPoint);
    unsigned int x = position.x;
    unsigned int y = getContentSize().height - position.y;

    auto temp = Sprite::createWithSpriteFrame(getSpriteFrame());
    temp->setAnchorPoint(Vec2(0, 0));
    temp->setPosition(Vec2(0, 0));
    auto render = RenderTexture::create(getContentSize().width, getContentSize().height, Texture2D::PixelFormat::RGBA8888);
    render->begin();
    temp->visit();
    render->end();
    Director::getInstance()->getRenderer()->render();

    auto image = render->newImage();
    unsigned char* data = image->getData();
    unsigned int* pixel = (unsigned int *)data;
    pixel = pixel + (y * (int)getContentSize().width) * 1 + x * 1;
    
    Color4B color4B = { 0, 0, 0, 0 };
    color4B.r = *pixel & 0xff;
    color4B.g = (*pixel >> 8) & 0xff;
    color4B.b = (*pixel >> 16) & 0xff;
    color4B.a = (*pixel >> 24) & 0xff;
    
    render->clear(0, 0, 0, 0);
    if (color4B.a == 0) {
        return false;
    }else {
        return true;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值