编辑:我已经能够通过使用PhysicsEditor生成多边形physicsbody而不是使用SKPhysicsBody(... alphaThreshold: ... )
--
出于某种原因,我觉得SKPhysicBodies有点不合适。当使用showPhysics
时,我的静止障碍物节点的物理体似乎处于正确的位置,但是我能够触发碰撞而不实际接触障碍物。如果你看下面的图片,它显示了我在哪里发现身体偏离中心,尽管showPhysics
告诉我其他。(注意,播放器节点在这些障碍节点的中间移动)。
我还认为值得注意的是,当球员在旅行时,他的身体似乎稍微向前移动,但我认为这可能是正常的。
我还使用SKPhysicsBody(... alphaThreshold: ... )
从.png图像创建physicbodies。
干杯。
编辑:下面是我如何创建障碍物理体。一旦它们被添加到世界节点中,它们就会被单独留下,直到需要移除它们。除此之外,我不会以任何方式改变他们。
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)
最佳答案
我假设您没有显示用于创建SKSpriteNode
和SKPhysicsBody
实例的确切图像。由于使用纹理定义SKPhysicsBody
的形状,您可能会遇到以下情况:
SKPhysicsBody documentation
如果不想创建自己的形状,可以使用SpriteKit基于sprite的纹理为您创建形状。
这是容易和方便的,但有时它可以给意想不到的结果取决于你使用的纹理你的雪碧。也许试着做一个明确的面具或使用一个简单的形状来代表你的物理身体。文件中有很好的例子和指导方针。
在设置对象的属性时,我也会遵循此模式:
// 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
,可以最大限度地减少可能难以调试的运行时崩溃的可能性。关于swift - SKPhysicBodies似乎不太合适,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46166374/