首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有时候,当碰到另一个雪碧时,精灵就会被推开。

有时候,当碰到另一个雪碧时,精灵就会被推开。
EN

Stack Overflow用户
提问于 2014-07-20 12:24:06
回答 1查看 132关注 0票数 0

我正在用cocos2d和SpriteBuilder制作一个游戏。有一个英雄的精灵和硬币,应该由他收集。这是一个水平滚动游戏,所以每次英雄接触一个硬币,这个硬币改变它的x坐标2000 is向右,新的y坐标是随机生成的。使用更新方法,我将它作为“新”硬币移动到可见区域。但是当英雄飞过而不收集时,硬币必须改变坐标,只有当它已经离开屏幕时,所以我尝试了这个解决方案:

代码语言:javascript
复制
-(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(我不确定它是否与这段代码有关):有时,当英雄触摸硬币时,英雄就像被推到左边一样。我不知道为什么。

  1. 怎么修呢?
  2. 是这样的吗,我是用来做硬币的,对吧?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-20 19:03:17

我认为你的做法有两个问题:

1.英雄弹出硬币。

要解决这个问题,你需要把你的硬币做成传感器。这样,你仍然会被告知碰撞,但英雄将简单地通过硬币,而不是实际击中它。

我不确定您是否可以在SpriteBuilder中设置它,但是您可能可以在加载场景后枚举所有硬币,并将sensor属性设置为YES

代码语言:javascript
复制
coin.physicsBody.sensor = YES;

像这样的事情是我认为您首先需要学习纯Cocos2D的原因之一,然后使用工具使您的生活更容易,比如SpriteBuilder。这是一个很好的工具,但在某些情况下,您仍然需要知道幕后发生了什么。

CGRectIntersectsRect 2.你把物理和之类的东西混在一起

如果使用物理引擎,则需要通过碰撞委托检测碰撞,而不是通过在update:中签入CGRectIntersectsRect

很难用几句话来解释如何做到这一点,所以这里有一个很好的教程,它展示了如何在Cocos2D v3中检测碰撞,当然还有一个关于我的书的章节。

顺便说一句,在操作物理节点时,根本不应该使用update:,而应该使用fixedUpdate:

我希望这能帮助你解决问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24850464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档