设置后更改固定的物理体位置

时间:2019-11-10 02:36:48

标签: swift sprite-kit skspritenode skphysicsbody

有没有一种方法可以在设置精灵后更改精灵固定位置。例如,下面将“顶部”精灵固定到“基本”精灵,我希望能够根据需要上下移动“顶部”精灵(更改固定的y位置)。我看到旋转固定的精灵很容易,但是移动位置似乎找不到解决方案。我尝试过移除引脚(固定=假),更改位置,然后重置引脚(固定=真),但是位置没有改变(请参阅触摸开始部分)。

非常感谢任何帮助或朝正确方向的推动,谢谢!!!

func generateSprites() {

    // BASE

    let sizeSpriteBase = CGSize(width: 40, height: 36)

    spriteBase = SKSpriteNode(texture: nil, color: UIColor.green, size: sizeSpriteBase)
    spriteBase.position.x = 0
    spriteBase.position.y = 0
    spriteBase.zPosition = 10000
    addChild(spriteBase)

    let physicsBodyBase = SKPhysicsBody(rectangleOf: sizeSpriteBase)
    physicsBodyBase.restitution = 0
    physicsBodyBase.allowsRotation = false
    physicsBodyBase.categoryBitMask = categoryMain
    physicsBodyBase.collisionBitMask = categorySolid
    physicsBodyBase.contactTestBitMask = categorySolid
    spriteBase.physicsBody = physicsBodyBase

    // TOP

    let sizeSpriteTop = CGSize(width: 40, height: 8)

    spriteTop = SKSpriteNode(texture: nil, color: UIColor.orange, size: sizeSpriteTop)
    spriteTop.position.x = 4
    spriteTop.position.y = spriteBase.size.height/2
    spriteBase.addChild(spriteTop)

    let physicsBodyTop = SKPhysicsBody(rectangleOf: sizeSpriteTop)
    physicsBodyTop.pinned = true
    physicsBodyTop.restitution = 0
    physicsBodyTop.allowsRotation = false
    physicsBodyTop.categoryBitMask = categoryMain
    physicsBodyTop.collisionBitMask = categorySolid
    physicsBodyTop.contactTestBitMask = categorySolid
    spriteTop.physicsBody = physicsBodyTop

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    spriteTop.physicsBody?.pinned = false
    spriteTop.position.y -= 8
    spriteTop.physicsBody?.pinned = true

}

1 个答案:

答案 0 :(得分:0)

您的代码看起来不错,但是我认为您的问题是由游戏循环以及您在TouchesBegan中更改物理物体的方式引起的。每个游戏循环仅触发一次Touches Began。因此,将固定属性设置为false,然后设置为true等同于将其设置为true。

相反,请尝试将pinned属性设置为false并使用touchesBegan方法移动对象。然后使用

之类的方法覆盖didFinishUpdate方法。
if pinned == false { pinned =  true}

哦,您是否将固定的主体设置为allowRotation = true!这以前让我失望了。

希望这会有所帮助