我正在使用Cocoa为Mac编写游戏.我目前正在实施热门测试,并发现CALayer提供了热门测试,但似乎没有实现alpha属性.正如我在堆叠在彼此的顶部倍多CALayers,我真的需要找到一种方法来确定哪些用户实际上意味着点击.
我想如果我能以某种方式得到一个包含指向包含点击点的所有CALayer的指针的数组,我可以通过它们过滤一些方法.然而,我到目前为止创建数组的唯一方法是:
NSMutableArray* anArrayOfLayers = [NSMutableArray array];
for (CALayer* aLayer in mapLayer.sublayers)
{
if ([aLayer containsPoint:mouseCoord])
[anArrayOfLayers addObject:aLayer];
}
Run Code Online (Sandbox Code Playgroud)
然后按照CALayer的z值对数组进行排序,然后检查位置处的像素是否为alpha.然而,在排序和alpha检查之间,这似乎是一个令人难以置信的性能猪.(你怎么检查阿尔法呢?)
有没有办法做到这一点?
Chr*_*eux 10
我在遇到类似问题containsPoint:
时偶然发现的一件事是CALayer 在您发送时使用的hitTest:
它的默认行为是测试边界,但是我们可以覆盖它并检查alpha通道,并使用CALayer的内置命中测试来处理其余的:
- (BOOL) containsPoint:(CGPoint)p
{
return CGRectContainsPoint(self.bounds, p) && !ImagePointIsTransparent(self.contents, p)) return YES;
}
Run Code Online (Sandbox Code Playgroud)
有一个关于在检索UIImage的像素alpha值时测试单个像素的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;
}
Run Code Online (Sandbox Code Playgroud)
(如果您正在使用renderInContext:
绘制到CALayer而不是设置其内容属性,那么它会更复杂.在这种情况下这可能很有用:http://www.cimgf.com/2009/02/03/记录你的核心动画动画/)
归档时间: |
|
查看次数: |
3555 次 |
最近记录: |