Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 有时当碰到另一个精灵时,精灵会被推开_Ios_Objective C_Cocos2d Iphone_Game Physics_Spritebuilder - Fatal编程技术网

Ios 有时当碰到另一个精灵时,精灵会被推开

Ios 有时当碰到另一个精灵时,精灵会被推开,ios,objective-c,cocos2d-iphone,game-physics,spritebuilder,Ios,Objective C,Cocos2d Iphone,Game Physics,Spritebuilder,我正在用cocos2d和SpriteBuilder制作一个游戏。有一个英雄精灵和硬币,应该由他收集。这是一个水平滚动的游戏,所以每次英雄触摸一枚硬币时,硬币的x坐标2000px会向右改变,并且随机生成新的y坐标。使用更新方法,我将其作为“新”硬币移动到可见区域。但当英雄飞过而没有收集到硬币时,硬币必须在屏幕上消失后才能改变坐标,所以我尝试了以下解决方案: -(void)update:(CCTime)delta{ _coin.position=ccp(_coin.position.x - d

我正在用cocos2d和SpriteBuilder制作一个游戏。有一个英雄精灵和硬币,应该由他收集。这是一个水平滚动的游戏,所以每次英雄触摸一枚硬币时,硬币的x坐标2000px会向右改变,并且随机生成新的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);
}
这是可行的,但之后我发现了一个小错误(我不确定它是否与此代码相关):有时,当英雄触摸硬币时,英雄就像被推到左边。我不知道为什么

  • 如何修复它
  • 这就是我用来制造硬币的方式,对吗

  • 我认为您的方法存在两个问题:

    1。英雄反弹硬币。

    要解决这个问题,你需要把你的硬币变成一个硬币。这样,您仍然会收到碰撞通知,但英雄只会通过硬币而不会实际击中它

    我不确定您是否可以在SpriteBuilder中设置此选项,但您可能可以在加载场景后枚举所有硬币,并将
    传感器
    属性设置为

    coin.physicsBody.sensor = YES;
    
    这是我认为您首先需要学习纯Cocos2D的原因之一,然后才需要使用使您的生活更轻松的工具,如SpriteBuilder。这是一个很好的工具,但在某些情况下,您仍然需要知道幕后发生了什么

    2。你把物理学和类似的东西混为一谈,比如
    CGRectIntersectsRect

    如果您使用的是物理引擎,则需要通过而不是通过在
    更新:
    中选中
    CGRectIntersectsRect
    来检测碰撞

    很难用几句话来解释如何做到这一点,所以这里有一个很好的例子,展示了如何在cocos2dv3中检测碰撞,当然,在中有一章是关于这一点的

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


    我希望这将帮助您解决问题。

    看起来您的英雄刚刚与硬币相撞并反弹回来。你用物理学来探测碰撞吗?如果是这样的话,你把硬币设置成传感器了吗?我想,当两个精灵碰撞时,默认情况下不会发生任何事情。我使用CGRectIntersectsRect来检测碰撞。我还在SpriteBuilder中将密度、摩擦力和弹性设置为零。我不确定你所说的“传感器”是什么意思,但可能是传感器,因为代码工作正常,collison的Bug有时只会出现。你至少需要显示用于确定玩家触摸硬币并做出反应的代码。看起来唯一显示的是一个旨在掩盖问题的黑客。您是否在SpriteBuilder中为英雄和硬币选中“启用物理”选项?我想你们是的,否则密度、摩擦力和弹性都不能改变。我创造了一个答案,因为它不适合评论。不,这本书只有英文:(很抱歉没有用俄语回复,但我认为StackExchange常见问题解答中有一条关于这方面的规则。