发布
社区首页 >问答首页 >Spritekit删除physicsBody

Spritekit删除physicsBody
EN

Stack Overflow用户
提问于 2014-02-25 10:43:39
回答 2查看 3K关注 0票数 1

在使用SpriteKit的iOS7中,如何只移除物理体,而将节点留在场景中?我试图允许碰撞发生,然后让汽车演员撞到障碍物墙上。

代码语言:javascript
代码运行次数:0
复制
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];
    }
}

但移除似乎并没有得到尊重。我可以看到出现多个命中(作为参考,此代码是从update方法调用的。

EN

回答 2

Stack Overflow用户

发布于 2015-07-26 03:25:12

相关:Why are didBeginContact called multiple times?

正如您所注意到的,尽管将物理主体设置为零,SKPhysicsContactDelegate-didBeginContact:还是被多次调用。这意味着在update cycle中的单个物理模拟期间,多个像素同时连接。

我相信SKNode-physicsBody已经被复制用于在循环中进行评估,您所做的任何更改在下一次物理模拟之前都不会生效。也可能是引擎认为联络同时发生,并且didBeginContact呼叫已经排队。

无论如何,以下内容对同一周期内的didBeginContact调用没有任何影响:

代码语言:javascript
代码运行次数:0
复制
node.physicsBody.categoryBitMask = 0
node.physicsBody.contactTestBitMask = 0
node.physicsBody.collisionBitMask = 0
node.physicsBody = nil;

我的解决方案如下:

在第一个didBeginContact

  • Only中,
  • 将planetNode.physicsBody设置为nil,以使用非nil节点属性physicsBodies

_

代码语言:javascript
代码运行次数:0
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2014-08-10 21:11:41

您可以添加一个新节点,该节点在与刚发生碰撞的汽车相同的位置上没有physicsBody,并且具有所有相同的值(纹理、速度等)。然后简单地移走相撞的汽车。将其中一个替换为另一个。

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

https://stackoverflow.com/questions/22003571

复制
相关文章

相似问题

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