2017-03-07 87 views
1

我有一个由玩家控制的SKShapeNode。我想把这个节点保存在父节点中。所以我创建了边,我使用SKPhysicsBody和碰撞位掩码来防止我的节点移出其父节点。玩家控制节点忽略冲突

当我尝试通过更新每个帧的位置来移动节点时,它只是忽略边缘。下面是使用的函数:

func move(direction: MoveDirection, withTimeInterval timeInterval: TimeInterval) { 

    var x, y: CGFloat 

    switch direction { 
    case .North: 
     x = 0 
     y = movementSpeed * CGFloat(timeInterval) 

    case .South: 
     x = 0 
     y = -movementSpeed * CGFloat(timeInterval) 

    case .East: 
     x = movementSpeed * CGFloat(timeInterval) 
     y = 0 

    case .West: 
     x = -movementSpeed * CGFloat(timeInterval) 
     y = 0 
    } 

    let sprite = spriteComponent.sprite 
    sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y) 

} 

的运动的伟大工程,但该节点可以到处去逛逛,只是不关心边缘(我打开skView.showPhysics,所以我可以看到他们)。

但是,如果我更换行:

sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y) 

由:

sprite.physicsBody?.applyForce(CGVector(dx: x, dy: y)) 

碰撞工作得很好。

感觉就像我们必须使用物理来移动物体,如果我们希望它们碰撞。但是我在Apple的文档中没有看到任何有关此限制的内容。那么这种行为是否预期?或者我错过了什么?

奖励点:

在由苹果公司提供的TaskBot游戏中,玩家的位置(或者看起来是),通过设置node.position改变(代码是有点......复杂,所以不是很确定)。如果有人可以给我一个提示?

谢谢!

回答

1

如果您手动移动SKSpriteNode,则不会发生冲突,因为您在覆盖物理引擎时说“无论如何放置此节点”。

如果你想要物理引擎可靠地产生碰撞,那么你只需要使用物理引擎通过力或冲动来移动你的物体。

如果您手动将节点移动到产生碰撞的位置,物理引擎会尝试将其移开,但如果继续尝试移动节点,则结果将不可预知。

+0

SKAction有同样的问题。基于一些测试,如果动作时间太短,它不会相互冲突(我使用update()timeInterval作为动作持续时间)。我的情况是在update()中调用move函数。如果我直接在keyDown()中调用它,碰撞工作正常。但事件发生后,如果我设置了高速移动,碰撞再次开始失败。简而言之,使用物理(力量,冲动等)来移动物理实体 – Heyfara

+0

实际上,每个手动位置变化都会以某种方式干扰物理系统。坚持一个或另一个总是最好的选择,但这也不是一个规则。不过,如果您应该避免同时以多种方式影响节点的位置。 – Whirlwind

+0

是 - 脑衰竭。我将编辑我的答案。 –