cocos2d CCSprite碰撞问题

时间:2012-01-04 13:13:58

标签: iphone objective-c ios cocos2d-iphone ccsprite

[我有2个对象,它们都是CCSprite的子类。 它们中的每一个都有一个实际代表精灵图像的CCSprite变量

示例:

@interface Player : CCSprite
{
    CCSprite *sprite;
}

@property (nonatomic, retain) CCSprite *sprite;

我正试图检测两者的碰撞但是当我尝试时:

- (void)detectCollision:(id)sender
{    
    for (Player *tempPlayer in self.playersArray) {        
        if (CGRectIntersectsRect([tempPlayer boundingBox], [mainPlayer boundingBox])) {
            //Collision
        }
    }
}

当我尝试时,它无法识别任何碰撞:

- (void)detectCollision:(id)sender
{    
    for (Player *tempPlayer in self.playersArray) {        
        if (CGRectIntersectsRect([tempPlayer.sprite boundingBox], [mainPlayer.sprite boundingBox])) {
            //Collision
        }
    }
}

即使尚未发生碰撞,它也会在屏幕上显示两个对象时检测到碰撞。

修改 忘了将boundingBox添加到对象......

由于

3 个答案:

答案 0 :(得分:1)

您是否查看了CGRectIntersectCGRect的参考信息?

您将注意到它需要传递两个CGRect结构。您在第一个发布的代码中传递了一个Player对象,在第二个代码中传递了一个CCSprite。

答案 1 :(得分:1)

tempPlayer.sprite和mainPlayer.sprite边界框将代表他们自己的superview中的rect,它也是一个精灵,而不是世界。例如,如果mainPlayer的rect是(150,200,100,100),并且其中的sprite具有相同的rect,则其boundingBox将为(0,0,100,100)。

我曾经遇到过这个问题并解决了如下问题: x表示tempPlayer.sprite,世界坐标= x表示tempPlayer + x表示tempPlayer.sprite。

和y相同。

答案 2 :(得分:0)

我从不使用边界框。你可能需要做一些数学计算并找出对象的长度/高度(以像素为单位)并使用它。此外,如果您设置了任何锚点,这可能会抛弃所有内容,并且您的碰撞将无法正常工作。

要实现自己的碰撞功能/事物,你可以在你的时间函数内做(如果你使用cocos2d可能是ccTime)并使用他们的CGPoints(位置)

这就是我个人会做的事,但是大多数人都使用chipmunk进行iphone编程。