Изменить закрепленное положение физического тела после его установки - PullRequest
1 голос
/ 10 ноября 2019

Есть ли способ изменить закрепленное положение спрайтов после его установки. Например, ниже приведен «верхний» спрайт, прикрепленный к «базовому» спрайту, и я хочу иметь возможность перемещать «верхний» спрайт вверх и вниз по мере необходимости (изменить положение закрепленного y). Я вижу, что легко вращать закрепленный спрайт, но, двигаясь в таком положении, я не могу найти решение. Я попытался удалить штифт (pinned = false), изменив положение, а затем сбросив штифт (pinned = true), но положение не изменилось (см. Раздел «штрихи в начале»).

Любая помощь или толчок в правильном направлении будет высоко ценится, спасибо !!!

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 голосов
/ 11 ноября 2019

Ваш код выглядит хорошо, но я думаю, что ваша проблема вызвана игровым циклом и тем, как вы меняете физическое тело в TouchesBegan. Прикосновения начинаются только один раз за игровой цикл. Таким образом, установка для закрепленного свойства значения false и затем true будет равносильно тому, что для него будет установлено значение true.

Вместо этого попробуйте установить для закрепленного свойства значение false и переместить объект в методе touchesBegan. Затем переопределите метод didFinishUpdate, например,

if pinned == false { pinned =  true}

Надеюсь, это поможет

...