如何判断CCSprite上的一个触摸点是否是透明区域?

本文介绍了一种在Cocos2d-x中判断CCSprite图片触摸位置是否位于透明区域的方法。通过创建ARGB位图上下文并获取指定点的颜色值来实现这一目标。

我创建了一个自定义的CCSprite,然后添加了一张png图片。
CCTexture2D *paddleTexture = [[CCTextureCache sharedTextureCache] addImage:@"1.png"];
        
MySprite *mSprite = [MySprite paddleWithTexture:paddleTexture];

当手指触摸到这个CCSprite时,我该如何判断当前触摸的位置是否是在图片上的透明区域,还是在图片的图像上。
请高手们帮帮忙,谢谢



备注:
//判断触摸点是否在CCSprite上
- (BOOL)containsTouchLocation:(UITouch *)touch
{
    CGPoint p = [self convertTouchToNodeSpaceAR:touch];
    CGRect r = [self rectInPixels];
    
    return CGRectContainsPoint(r, p);
}


====解决方案如下================================

CGImageRef inImage;

调用getPixelColorAtLocation方法,传入图片上的一个点,根据返回值判断是否透明区域(如果返回值为0则表示是透明区域)

- (int)getPixelColorAtLocation:(CGPoint)point 
{
    
    CGContextRef cgctx = [self createARGBBitmapContextFromImage];
    if (cgctx == NULL) { return -1; /* error */ }
    
    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);
    
    CGRect rect = {{0,0},{w,h}}; 
    
    CGContextDrawImage(cgctx, rect, inImage); 
    
    unsigned char* data = CGBitmapContextGetData (cgctx);
    
    int alpha;
    if (data != NULL) {
        
        @try {
            int offset = 4*((w*round(point.y))+round(point.x));
            
            alpha =  data[offset]; 
           
        }
        @catch (NSException * e) {
                    }
        @finally {
            
        }
        
    }
    
    
    CGContextRelease(cgctx); 
    
    if (data) { free(data); }
    
    return alpha;
}

- (CGContextRef)createARGBBitmapContextFromImage
{
    
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;
    
    size_t pixelsWide = CGImageGetWidth(inImage);
    size_t pixelsHigh = CGImageGetHeight(inImage);
    
    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);
    
    colorSpace = CGColorSpaceCreateDeviceRGB();
    if (colorSpace == NULL)
        return nil;
    
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL)
    {
        CGColorSpaceRelease( colorSpace );
        return nil;
    }
    
    context = CGBitmapContextCreate (bitmapData,
                                     pixelsWide,
                                     pixelsHigh,
                                     8,
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedFirst|kCGBitmapByteOrder32Big);
    
    if (context == NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
    }
    
    CGColorSpaceRelease( colorSpace );
    
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    
    return context;
}

转载于:https://www.cnblogs.com/pengyingh/articles/2479321.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值