在带有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];
}
}
但删除似乎并未得到尊重。我可以看到多次点击发生(供参考,此代码是从更新方法中调用的。
答案 0 :(得分:1)
相关:Why are didBeginContact called multiple times?
正如您所注意到的那样,尽管将物理体设置为零,但多次调用SKPhysicsContactDelegate-didBeginContact:。这意味着在update cycle的单个物理模拟过程中,多个像素会同时连接。
我相信SKNode-physicsBody已被复制用于循环评估,在下一次物理模拟之前,您所做的任何更改都不会受到尊重。也可能是引擎认为联系人同时发生并且didBeginContact调用已经排队。
无论以下哪个对同一周期中的didBeginContact调用没有影响:
node.physicsBody.categoryBitMask = 0
node.physicsBody.contactTestBitMask = 0
node.physicsBody.collisionBitMask = 0
node.physicsBody = nil;
我的解决方案如下:
_
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 :(得分:0)
你可以添加一个没有physicsBody的新节点,与刚碰撞的汽车相同的位置,它具有所有相同的值(纹理,速度等等),然后简单地移除碰撞的汽车。互换一个。