cocos2d CCSprite 碰撞问题

Posted

技术标签:

【中文标题】cocos2d CCSprite 碰撞问题【英文标题】:cocos2d CCSprite Collision issue 【发布时间】:2012-01-04 13:13:58 【问题描述】:

[我有 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...

谢谢

【问题讨论】:

【参考方案1】:

tempPlayer.sprite 和 mainPlayer.sprite 边界框将在它们自己的超级视图中表示矩形,它也是一个精灵,而不是世界。比如mainPlayer的rect是(150, 200, 100, 100),里面的sprite也是同一个rect,那么它的boundingBox就是(0, 0, 100, 100)。

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

y 也一样。

【讨论】:

【参考方案2】:

您查看过CGRectIntersectCGRect 的参考信息吗?

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

【讨论】:

已修复,忘记添加boundingBox,问题依旧【参考方案3】:

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

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

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

【讨论】:

以上是关于cocos2d CCSprite 碰撞问题的主要内容,如果未能解决你的问题,请参考以下文章

用另一个 CCSprite/CCNode 剪辑 CCSprite/CCNode - Cocos2D

cocos2d CCSprite + 动画重复?

cocos2d 如何创建继承与 ccsprite的类并在项目中使用

在 CCSprite 中淡入图像?

Cocos2D:从文档目录中的文件创建精灵

cocos2d this->