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