精灵套件多次碰撞

时间:2014-12-16 09:53:41

标签: sprite-kit

我正在通过Sprite Kit制作游戏的教程/课程,我遇到了同时发生多次碰撞的问题。

我正在为所有碰撞实施didBeginContact:方法,因为似乎存在一个已知问题,如果速度太低且角度太窄,物体可能会“粘住”到身体上。

通过制作     _ball.physicsBody.collisionBitMask = 0;

并将以下行放在didBeginContact

if(other body == firstbody && _ball == secondbody)
secondBody.velocity = (CGVectorMake(secondBody.velocity.dx * -1.0, secondBody.velocity.dy));

(或垂直碰撞的dy * -1.0)

我可以使物体自然弹跳并起作用。

我遇到的问题是_ball上有多个联系人。如果1次碰撞使_ball反转其方向并且它击中另一个再次反转方向的相同类型的物体,则_ball将继续沿其原始方向移动(Double Negative)。 _ball只是穿过这些物体。如果我,我可以让它反弹     secondBody.categoryBitMask = 0; 但我接着将_ball归还原来的类别。

有人知道您在处理联系人一次后是通过联系人循环还是停止联系?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我遇到了很多碰撞正确的问题。有时它会得到一个,有时没有。所以我尝试了这个并且它有效。唯一要改变的是didBeginContact方法。

我会假设您声明的类别正确实现了物理委托。所以:

//define collision categories on the top of implementation file
static const uint32_t category1    = 0x1 << 0;
static const uint32_t category2    = 0x1 << 1;
static const uint32_t category3    = 0x1 << 2;

尝试将didBeginContact中的代码替换为此代码。我记得在我这样做之后,正确的碰撞终于开始起作用了。

-(void)didBeginContact:(SKPhysicsContact *)contact
{

   SKNode *newFirstBody = contact.bodyA.node;
   SKNode *newSecondBody = contact.bodyB.node;

  uint32_t collision = newFirstBody.physicsBody.categoryBitMask |  newSecondBody.physicsBody.categoryBitMask;

 if (collision == (category1 | category2))
{
    NSLog(@"hit");
}

 }

希望有所帮助