cocos2d精灵碰撞检测

时间:2012-03-22 13:19:09

标签: iphone objective-c cocos2d-iphone collision-detection sprite

我目前正在使用cocos2d为iphone创建一个指向并点击应用程序。然而,对于我当前的实现,碰撞检测条件仅在我点击左上角而不是精灵内的任何位置时才是真的。如果我将锚点位置设置为0,这会使事情变得更好,但这会导致我的旋转精灵特征中断。

这是我的代码,有人可以在这里发现任何错误吗? 在我的初始化代码中

if( (self=[super init])) 
{       

        cocosGuy = [TouchableSprites spriteWithFile: @"Icon.png"];  
        //[cocosGuy setAnchorPoint:CGPointMake(0, 0)];
        cocosGuy.position = ccp( 200, 300 );
    //[cocosGuy setPosition: ccp(100,100)];
        [self addChild:cocosGuy];
    self.isTouchEnabled = YES;
}

在touchBegan中我确定是否触摸了图像

    CGPoint pt = [touch locationInView:[touch view]];
    CGPoint ptConv = [[CCDirector sharedDirector] convertToGL:pt];

CGSize size = [cocosGuy contentSize];
CGPoint point = [cocosGuy position];
CGRect rect = CGRectMake(point.x, point.y, size.width, size.height); 

if (CGRectContainsPoint(rect, ptConv))
{
    retValue = YES;
}   

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

您正在生成的矩形采用触摸点,然后将该点的矩形作为角点。

CCSprites的原点位于图像中间。因此,在制作矩形时需要考虑到这一点

CGRect rect = CGRectMake(point.x - (size.width / 2), point.y - (size.height / 2), size.width, size.height);

答案 1 :(得分:0)

要处理旋转,最好的方法是将触摸点转换为精灵局部空间(这也将处理正确的缩放和精灵层次结构)

CGPoint ptConv = [cocosGuy convertTouchToNodeSpace: touch];
if (CGRectContainsPoint ([cocosGuy boundingBox], ptConv)
{
    retValue = YES;
}