Как мне переместить SKSpriteNode в область вне его ограничений? - PullRequest
0 голосов
/ 11 июня 2019

Итак, у меня есть эти движущиеся спрайты с физическими телами, которые я изначально ограничил одной областью. Допустим, назовите эту область Box1. Когда спрайты выходят за границы Box1, они возвращаются назад, и SKConstraint - это просто дополнительная мера, чтобы убедиться, что они остаются в пределах блока.

Я пытаюсь сделать кнопку, которая заставляет все спрайты в Box1 перемещаться по экрану во второй блок (Box2), который в основном идентичен Box1, но прямо рядом с ним. Box1 и Box2 разделяют граничную стену, поэтому экран по существу разделен на две части.

Моя проблема в том, что когда я вызываю функцию кнопки, спрайты застревают на стене и не могут пройти мимо нее в Box2. Я попытался установить как физические тела, так и SKConstraints узлов на ноль, поэтому я не знаю, что еще мешает им.

    func moveSprites(){
    if box1Sprites.isEmpty == false {
        for sprite in box1Sprites{
            sprite.constraints = nil
            sprite.physicsBody = nil
            let moveAction = SKAction.move(to: CGPoint(x: -300, y: 0), duration: 1) //This is a point within Box2
            sprite.run(moveAction)
        }
    }
}

РЕДАКТИРОВАТЬ:

Я также сделал так, чтобы я мог перетаскивать спрайты из одного блока в другой, и код для этого почти такой же, и он отлично работает.

var currentMovingSprite: SKSpriteNode? = SKSpriteNode()

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
    let pos = touch.location(in: self)
    let node = self.atPoint(pos)
        if node.name == "sprite"{
           node.constraints = nil
           node.physicsBody = nil
           currentMovingSprite = node
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let pos = touch.location(in: self)
            if let sprite = currentMovingSprite{
                sprite.position = pos
            }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    spritePhysics(sprite: currentMovingSprite) // resets the sprite to how it was before
    currentMovingSprite = nil
}    
...