微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cocoa – 使用CALayer内容的alpha属性使用CALayer进行测试

我正在使用Cocoa为Mac编写游戏.我目前正在实施热门测试,并发现CALayer提供热门测试,但似乎没有实现alpha属性.由于我有时很多CALayers堆叠在一起,我真的需要找到一种方法来确定用户实际上要点击的内容.

我想如果我能以某种方式得到一个包含指向包含点击点的所有CALayer的指针的数组,我可以通过它们过滤一些方法.然而,我到目前为止创建数组的唯一方法是:

NSMutableArray* anArrayOfLayers = [NSMutableArray array];
    for (CALayer* aLayer in mapLayer.sublayers)
    {
        if ([aLayer containsPoint:mouseCoord])
            [anArrayOfLayers addobject:aLayer];
    }

然后按照CALayer的z值对数组进行排序,然后检查位置上的像素是否为alpha.然而,在排序和alpha检查之间,这似乎是一个令人难以置信的性能猪. (你怎么检查阿尔法呢?)

有没有办法做到这一点?

解决方法

我在遇到类似问题时偶然发现的一件事是CALayer使用containsPoint:当你发送它时hitTest:

它的认行为是测试边界,但是我们可以覆盖它并检查alpha通道,并使用CALayer的内置命中测试来处理其余的:

- (BOOL) containsPoint:(CGPoint)p 
{
    return CGRectContainsPoint(self.bounds,p) && !ImagePointIsTransparent(self.contents,p)) return YES;
}

一个关于在Retrieving a pixel alpha value for a UIImage测试单个像素的alpha的讨论

这符合我的目的:

static BOOL ImagePointIsTransparent(CGImageRef image,CGPoint p)
{
    uint8_t alpha;

    CGContextRef context = CGBitmapContextCreate(&alpha,1,8,NULL,kCGImageAlphaOnly);
    CGContextDrawImage(context,CGRectMake(-p.x,-p.y,CGImageGetWidth(image),CGImageGetHeight(image)),image);
    CGContextRelease(context);

    return alpha == 0;
}

(如果你使用renderInContext:绘制到CALayer而不是设置其contents属性,那么它会更复杂.在这种情况下这可能很有用:http://www.cimgf.com/2009/02/03/record-your-core-animation-animation/)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐