Swift 3 (SpriteKit):将SKPhysicsBody对齐到SKShapeNode

4

我正在使用以下代码在我的程序中创建SKShapeNode:

let points = [CGPoint(x: x, y: y), CGPoint(x: x2, y: y2)]
let line = SKShapeNode(points: &points, count: points.count)

我遇到的问题是,每当我将physicsBody添加到线条中时,physicsBody与线条不对齐。我意识到这个问题是因为线条的位置始终是CGPoint(x: 0, y: 0),因此无论线条在哪里,physicsBody始终位于屏幕的中心。以下是创建physicsBody的代码:

line.physicsBody = SKPhysicsBody(rectangleOf: (line.frame.size))

如果有人知道如何将物理体与线对齐,请回复您的解决方案。谢谢!


有一些使用其他初始化程序来修复这个问题的方法。不过,首先让我们调试一下你的示例。print(line.frame.size)输出了什么?你能否编辑你的问题并硬编码两个CGPoint的值(x和y坐标)? - Whirlwind
1个回答

4
如果您想让物理体从一个点移动到另一个点,可以使用类似以下的方法:
class GameScene:SKScene {

    override func didMove(to view: SKView) {
        var points = [CGPoint(x: 22, y: 22), CGPoint(x: 155, y: 155)]
        let line = SKShapeNode(points: &points, count: points.count)
        print(line.frame.size)

        line.physicsBody = SKPhysicsBody(edgeFrom: points[0], to: points[1])

        addChild(line)
    }
}

这将使用两个点创建基于边缘的物理体。边缘物理体默认为静态,所以请注意。要注册联系人(或与此物体碰撞),则其他物体必须是动态的。
如果您希望使此物体动态,请查找基于体积的初始化器

好的,谢谢。另外,由于它是静态的,如果我更改线的线宽,如何能够更改物理体的宽度,使其大小相同? - J.Treutlein
@J.Treutlein,您所说的“线宽”是指什么?是SKShapeNode的lineWidth属性还是其他东西?您能否在评论中展示一下您的意思?如何更改线宽? - Whirlwind
这是我的意思:line.lineWidth = CGFloat(width) - J.Treutlein
好的。你不能像那样改变物理体。但这并不意味着它是不可改变的。但这是另一个话题,当你遇到困难时,你可以写另一个问题,这样我或其他人肯定会回答的。对于未来的读者来说,这总是更好的。清晰的问题,明确的答案。一个线程中没有多个问题/解决方案。 - Whirlwind
最近我不得不收藏你的答案太多了...我以为我懂一些东西=/ - Fluidity
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接