[我有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添加到对象......
由于
答案 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编程。