gpt4 book ai didi

cocoa - 使用 CALayer 内容的 alpha 属性进行 CALayer HitTest

转载 作者:行者123 更新时间:2023-12-03 16:08:36 35 4
gpt4 key购买 nike

我正在使用 Cocoa 为 Mac 编写游戏。我目前正在实现 HitTest ,并发现 CALayer 提供 HitTest ,但似乎没有实现 alpha 属性。由于我有时会将许多 CALayer 堆叠在一起,因此我确实需要找到一种方法来确定用户实际想要单击的内容。

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

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 channel ,然后使用 CALayer 的内置 HitTest 来处理其余的事情:

- (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, 1, 8, 1, NULL, kCGImageAlphaOnly);
CGContextDrawImage(context, CGRectMake(-p.x, -p.y, CGImageGetWidth(image), CGImageGetHeight(image)), image);
CGContextRelease(context);

return alpha == 0;
}

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

关于cocoa - 使用 CALayer 内容的 alpha 属性进行 CALayer HitTest ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2944064/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com