我正在用cocos2d和SpriteBuilder制作一个游戏。有一个英雄的精灵和硬币,应该由他收集。这是一个水平滚动游戏,所以每次英雄接触一个硬币,这个硬币改变它的x坐标2000 is向右,新的y坐标是随机生成的。使用更新方法,我将它作为“新”硬币移动到可见区域。但是当英雄飞过而不收集时,硬币必须改变坐标,只有当它已经离开屏幕时,所以我尝试了这个解决方案:
-(void)update:(CCTime)delta{
_coin.position=ccp(_coin.position.x - delta * scrollSpeed, _coinY);
if (CGRectIntersectsRect(_hero.boundingBox,_coin.boundingBox)) {
_coinY=arc4random() % 801 + 100;
_coin.position=ccp(_coin.position.x + 2000.f,_coinY);
}
else if(_hero.position.x >= _coin.position.x + 150){
_coinY=arc4random() % 801 + 100;
_coin.position=ccp(_coin.position.x + 2000.f,_coinY);
}它可以工作,但在那之后我发现了一个小bug(我不确定它是否与这段代码有关):有时,当英雄触摸硬币时,英雄就像被推到左边一样。我不知道为什么。
发布于 2014-07-20 19:03:17
我认为你的做法有两个问题:
1.英雄弹出硬币。
要解决这个问题,你需要把你的硬币做成传感器。这样,你仍然会被告知碰撞,但英雄将简单地通过硬币,而不是实际击中它。
我不确定您是否可以在SpriteBuilder中设置它,但是您可能可以在加载场景后枚举所有硬币,并将sensor属性设置为YES
coin.physicsBody.sensor = YES;像这样的事情是我认为您首先需要学习纯Cocos2D的原因之一,然后使用工具使您的生活更容易,比如SpriteBuilder。这是一个很好的工具,但在某些情况下,您仍然需要知道幕后发生了什么。
CGRectIntersectsRect 2.你把物理和之类的东西混在一起
如果使用物理引擎,则需要通过碰撞委托检测碰撞,而不是通过在update:中签入CGRectIntersectsRect。
很难用几句话来解释如何做到这一点,所以这里有一个很好的教程,它展示了如何在Cocos2D v3中检测碰撞,当然还有一个关于我的书的章节。
顺便说一句,在操作物理节点时,根本不应该使用update:,而应该使用fixedUpdate:。
我希望这能帮助你解决问题。
https://stackoverflow.com/questions/24850464
复制相似问题