我正在通过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归还原来的类别。
有人知道您在处理联系人一次后是通过联系人循环还是停止联系?
有什么想法吗?
答案 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");
}
}
希望有所帮助