1

[我有 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添加到对象...

谢谢

4

3 回答 3

1

tempPlayer.sprite 和 mainPlayer.sprite 边界框将在它们自己的超级视图中表示矩形,这也是一个精灵,而不是世界。例如,如果 mainPlayer 的 rect 是 (150, 200, 100, 100),并且其中的 sprite 具有相同的 rect,那么它的 boundingBox 将是 (0, 0, 100, 100)。

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

和 y 一样。

于 2012-01-04T14:35:27.943 回答
1

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

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

于 2012-01-04T13:25:56.450 回答
0

我从不使用边界框。您可能需要做一些数学运算并计算出对象的长度/高度(以像素为单位)并使用它。此外,如果您设置了任何锚点,这可能会引发所有问题,并且您的碰撞将不起作用。

要实现您自己的碰撞功能/事物,您可以在您的时间函数中执行它(如果您使用的是 cocos2d,可能是 ccTime)并使用它们的 CGPoints(位置)

这就是我个人会做的事情,但大多数人使用花栗鼠进行 iphone 编程。

于 2012-01-04T14:40:14.010 回答