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

2652

被折叠的 条评论
为什么被折叠?



