Ios Spritekit移除physicsBody

Ios Spritekit移除physicsBody,ios,physics,sprite-kit,Ios,Physics,Sprite Kit,在使用SpriteKit的IOS 7中,如何仅移除物理实体,而将节点留在场景中?我试图让碰撞发生,然后让汽车演员冲破障碍墙 for (SKSpriteNode *node in _obstacles) { node.position = CGPointMake(node.position.x - 2, node.position.y); if( [_car intersectsNode: node] && node.physicsBody.collisionBi

在使用SpriteKit的IOS 7中,如何仅移除物理实体,而将节点留在场景中?我试图让碰撞发生,然后让汽车演员冲破障碍墙

for (SKSpriteNode *node in _obstacles)
{
    node.position = CGPointMake(node.position.x - 2, node.position.y);

    if( [_car intersectsNode: node] && node.physicsBody.collisionBitMask == 0)
    {
        NSLog(@"We have a hit!");
        _lives--;

        //prevent simultaneous hit
        node.physicsBody.collisionBitMask = 1;
        node.physicsBody.contactTestBitMask = 1;
        node.physicsBody.dynamic = NO;

        node.physicsBody = nil;

       // [removeRequired addObject:node];
        //flash the car to show momentary invuln

        if(_lives <= 0)
        {
            _gameOver = YES;
        }
    }
    else if( (node.position.x + (node.size.width / 2)) < 0)
    {
        [removeRequired addObject:node];
    }
}
for(SKSpriteNode*节点在_障碍物中)
{
node.position=CGPointMake(node.position.x-2,node.position.y);
if([\u car intersectsNode:node]&&node.physicsBody.collisionBitMask==0)
{
NSLog(@“我们成功了!”);
_生命--;
//防止同时命中
node.physicsBody.collisionBitMask=1;
node.physicsBody.contactTestBitMask=1;
node.physicsBody.dynamic=否;
node.physicsBody=nil;
//[removeRequired addObject:节点];
//闪烁汽车以显示瞬间的恶作剧

如果(_lives您可以添加一个新节点,该节点与刚刚碰撞的汽车在同一位置没有物理实体,并且具有所有相同的值(纹理、速度等),然后只需删除碰撞的汽车。将一个替换为另一个。

相关:

正如您所注意到的,尽管将Physical body设置为nil,但仍多次调用。这意味着在中的单个物理模拟期间,多个像素同时连接

我相信已在循环中复制了用于评估的,您所做的任何更改都将在下一次物理模拟之前得到尊重。也可能是引擎认为联系人同时发生,并且didBeginContact调用已经排队

无论如何,以下内容对同一周期内的didBeginContact调用无效:

node.physicsBody.categoryBitMask = 0
node.physicsBody.contactTestBitMask = 0
node.physicsBody.collisionBitMask = 0
node.physicsBody = nil;
我的解决方案如下:

  • 在第一个didBeginContact中将planetNode.physicsBody设置为零
  • 仅对具有非nil节点属性的PhysicsBody作出反应
_


您不想删除汽车的物理车身?是否将物理车身单独存储在其他位置?将其设置为零就足够了
func didBeginContact(contact: SKPhysicsContact) {
  if let planetNode = getNodeFromContact(contact, categoryBitMask: PhysicsCategory.Planet) {
    NSLog("Planet hit")
    if let physicsBody = planetNode.physicsBody {
      physicsBody.contactTestBitMask = PhysicsCategory.None
    }
    planetNode.physicsBody = nil
    planetNode.addChild(NodeFactory.explosion())
    planetNode.runAction(SKAction.fadeOutWithDuration(0.5))

    if let shipNode = getNodeFromContact(contact, categoryBitMask: PhysicsCategory.Ship) {
      NSLog("Ship hit")
      shipNode.runAction(actionBlink())
    }
  }
}

func getNodeFromContact(contact: SKPhysicsContact, categoryBitMask: UInt32) -> SKNode? {
  if (contact.bodyA.categoryBitMask & categoryBitMask) > 0 {
    return contact.bodyA.node;
  } else if (contact.bodyB.categoryBitMask & categoryBitMask) > 0 {
    return contact.bodyB.node;
  }
  return nil
}