SKPhysicBodies似乎略微偏离

时间:2017-09-12 01:06:00

标签: swift sprite-kit

编辑我已经能够通过使用PhysicsEditor制作多边形物理体而不是使用SKPhysicsBody(... alphaThreshold: ... )来解决这个问题

-

由于某种原因,我遇到的问题是我假设SKPhysicBodies略微偏离了地方。在使用showPhysics时,我的固定障碍物节点似乎将其物理体置于正确的位置,但是我能够在不实际接触障碍物的情况下触发碰撞。如果你看下面的图像,它会显示我发现物理体偏离中心的位置,尽管showPhysics告诉我。 (注意,玩家节点在这些障碍节点的中间行进)。

enter image description here

我还认为值得注意的是,当玩家正在旅行时,它的物理人员似乎稍稍向前走,但我认为这可能是正常的。

我还使用SKPhysicsBody(... alphaThreshold: ... )从.png图像创建物理实体。

干杯。

编辑:这是我如何创建障碍物理体。一旦将它们添加到worldNode中,它们就会被单独留下,直到需要将它们移除。除此之外,我不会以任何方式改变它们。

let obstacleNode = SKSpriteNode(imageNamed: ... )
obstacleNode.position = CGPoint(x: ..., y: ...)
obstacleNode.name = "obstacle"

obstacleNode.physicsBody = SKPhysicsBody(texture: obstacleNode.texture!, alphaThreshold: 0.1, size: CGSize(width: obstacleNode.texture!.size().width, height: obstacleNode.texture!.size().height))
obstacleNode.physicsBody?.affectedByGravity = false
obstacleNode.physicsBody?.isDynamic = false
obstacleNode.physicsBody!.categoryBitMask = CC.wall.rawValue
obstacleNode.physicsBody!.collisionBitMask = CC.player.rawValue
obstacleNode.physicsBody!.contactTestBitMask = CC.player.rawValue

worldNode.addChild(obstacleNode)

玩家节点的处理方式相同,这是玩家的移动方式。

playerNode.physicsBody?.velocity = CGVector(dx: dx, dy: dy)

1 个答案:

答案 0 :(得分:1)

我假设您没有显示用于创建SKSpriteNodeSKPhysicsBody个实例的确切图片。由于您使用纹理来定义SKPhysicsBody的形状,因此可能会遇到此问题:

SKPhysicsBody documentation

  

如果您不想创建自己的形状,可以使用SpriteKit根据精灵的纹理为您创建形状。

这很简单方便,但有时可能会产生意想不到的结果,具体取决于您为精灵使用的纹理。也许尝试制作一个明确的面具或使用简单的形状来表示你的物理身体。该文档中有非常好的示例和指南。

当您在对象上设置属性时,我也会遵循此模式:

// safely unwrap and handle failure if it fails
guard let texture = obstacleNode.texture else { return } 

// create the physics body
let physicsBody = SKPhysicsBody(texture: texture, 
                                alphaThreshold: 0.1, 
                                size: CGSize(width: texture.size().width, 
                                             height: texture.size().height))

// safely set its properties without the need to unwrap an Optional
physicsBody.affectedByGravity = false

// set the rest of the properties

// set the physics body property on the node
obstacleNode.physicsBody = physicsBody

通过在SKPhysicsBody的具体实例上设置属性并完全解包和测试Optionals,可以最大限度地减少可能难以调试的运行时崩溃的可能性。