博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何判断CCSprite上的一个触摸点是否是透明区域?
阅读量:6430 次
发布时间:2019-06-23

本文共 2055 字,大约阅读时间需要 6 分钟。

我创建了一个自定义的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;
}

转载地址:http://xrnga.baihongyu.com/

你可能感兴趣的文章
如何精简企业主数据“裹脚布”
查看>>
Pointer on C
查看>>
电子名片价值篇,让您了解不一样的电子名片
查看>>
& 号和管道符号(|)在不同场景下的使用方法
查看>>
curl 浏览器模拟请求实战
查看>>
多个VLAN中的vrrp备份组配置举例
查看>>
运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(六)
查看>>
interlib在tomcat7.0的安装
查看>>
C#中 Process的扩展类ProcessExtensions
查看>>
水晶报表在大型WEB内部管理系统里的滑铁卢
查看>>
我的友情链接
查看>>
Git学习
查看>>
trove 基于 centos7 制作 mysql5.6 镜像
查看>>
结合i节点和数据块分析linux中软链接和硬链接的区别
查看>>
Heartbeat crm的配置
查看>>
Stream
查看>>
我的友情链接
查看>>
Windows Server 2012_Install_Guide
查看>>
ISA Server搭建站点对站点×××
查看>>
我的友情链接
查看>>