gpt4 book ai didi

ios - Spritekit 移除 physicsBody

转载 作者:行者123 更新时间:2023-11-29 12:52:53 26 4
gpt4 key购买 nike

在带有 SpriteKit 的 IOS 7 中,如何只移除物理体而将节点留在场景中?我试图让碰撞发生,然后让汽车 Actor 冲破障碍墙。

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];
}
}

但是移除似乎并没有得到尊重。我可以看到发生了多次点击(作为引用,此代码是从更新方法调用的。

最佳答案

相关: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;

我的解决方案如下:

  • 在第一个 didBeginContact 中将 planetNode.physicsBody 设置为 nil
  • 仅对具有非零节点属性的 physicsBodies 使用react

_

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
}

关于ios - Spritekit 移除 physicsBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22003571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com