检测触摸精灵和convertToNodeSpaceAR

时间:2011-04-04 14:31:53

标签: ios cocos2d-iphone

我很难获得像检测精灵上的触摸一样简单的工作......有人可以帮忙吗?我正在尝试创建一个方法作为CCSprite的类别,给定一个点或触摸将返回YES如果该点在精灵内,否则返回NO。

目前我有一个实现,当精灵不是来自Zwoptex的裁剪纹理的一部分时(例如,用于精灵的图像没有被修剪),这似乎有效。

CGPoint point = [touch locationInView:[touch view]];
point = [[CCDirector sharedDirector] convertToGL: point];
CGRect spriteRect = self.textureRect;
spriteRect.origin = ccpAdd(ccpSub(self.positionInPixels, self.anchorPointInPixels), self.offsetPositionInPixels);
return CGRectContainsPoint(spriteRect, point);    

我发现如果在原始纹理中修剪了精灵,这不起作用。这种变化似乎可以解决问题

CGRect spriteRect = self.textureRect;
spriteRect.origin = ccpAdd(self.offsetPositionInPixels, self.positionInPixels);
return CGRectContainsPoint(spriteRect, [self convertTouchToNodeSpaceAR:touch]);    

但是现在我有一组来自帧缓存的精灵似乎不喜欢这个!它们被修剪,我看不出与上面代码一起使用的精灵有什么不同。有人能否阐明convertTouchToNodeSpaceAR的含义:?我确定问题在于我的无知,并且在Cocos2d框架中有一种共同的优雅方式...

1 个答案:

答案 0 :(得分:0)

问题可能是CGRectContainsPoint();。我有一段时间遇到同样的问题,我怀疑我们所比较的矩形和点数没有转化为相同的点系统,产生负面结果。

解决方案:

  1. 创建一个可以在彼此之间正确转换点系统的方法/定义。
  2. 我做了什么:创建一个网格类,跟踪网格上的精灵位置,并将触摸转换为网格上的点。
  3. 选项1可能对您的需求更有意义,但我需要经常引用相对于彼此的精灵位置,这对我来说是有意义的。

    如果你想使用选项1,我会建议你得到一些NSLog并打印出一个矩形点和你要比较的点,并弄清楚它们的不同之处。