Перемещение текстуры SpriteNode, но не PhysicBody - PullRequest
0 голосов
/ 25 марта 2020

Работая над игрой прямо сейчас, я столкнулся с проблемой управления SkSpriteNodes. У меня есть SpriteNode, размер текстуры которого меньше назначенного ему размера PhysicsBody. Благодаря чему-то, похожему на SKAction, можно перемещать только текстуру узла, а не его физическое тело?

Чтобы объяснить проблему другими словами, я дам вам график c пример:

c

Как вы можете видеть, я хочу достичь не изменять свойства PhysicsBody (чтобы не влиять на столкновение или проблемы с продолжает переназначение объектов PhysicsBody), но изменяя длину текстуры и корректируя ее положение. Как я могу достичь этого программно?

Немного кода для контекста, который просто иллюстрирует проблему:

let node = SKSpriteNode(color: .red, size: CGSize(width: 8, height: 60)
node.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 8, height: 60)
self.addChild(node)

//what I've tried is something like that
//It causes glitches in visualisation... and I need to move the object since resizing is towards the center.
let resize = SKAction.scaleY(to: 0.5, duration: 5)
let move = SKAction.move(to: node.position - CGPoint(x:0, y:node.size.height*0.5), duration: 5)
let group = SKAction.group([resize, move])
            node.run(group)

//And this is even worse if I add, in this specific example, another point fixed to the previous node
let node2 = SKSpriteNode(color: .blue, size: CGSize(width: 8, length: 8)
node2.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 8, height: 8))
node2.position = CGPoint(x: 0, y: -node.height)
self.addChild(node2)
self.physicsWorld.add(SKPhysicsJointFixed.joint(withBodyA: node.physicsBody! , bodyB: node2.physicsBody!, anchor: CGPoint(x: 0, y: -node.size.height)))

1 Ответ

0 голосов
/ 31 марта 2020

Я понял твою проблему.

let resize = SKAction.scaleY(to: 0.5, duration: 5) 

Эта строка приведет к тому, что физический орган будет равномерно масштабировать оси x и y. В то время как ваша текстура будет просто масштабировать ось Y.

Не так просто изменять физическую форму, чтобы она соответствовала действиям

Хотя один из способов сделать это - вызвать метод из

override func didEvaluateActions()

Примерно так:

    var group1: SKAction? = nil
    var group2: SKAction? = nil
    var touchCnt = 0
    var test = SKSpriteNode(texture: SKTexture(imageNamed: "circle"), color: .blue, size: CGSize(width: 100, height: 100))

    func setActions() {
      let newPosition = CGPoint(x: -200, y: 300)
      let resize1 = SKAction.scaleY(to: 0.5, duration: 5)
      let move1   = SKAction.move(to: newPosition, duration: 5)
      group1 = SKAction.group([resize1, move1])
      let resize2 = SKAction.scaleY(to: 1, duration: 5)
      let move2   = SKAction.move(to: position, duration: 5)
      group2 = SKAction.group([resize2, move2])
    }

    func newPhysics(node: SKSpriteNode) {
      node.physicsBody = SKPhysicsBody(texture: node.texture!, size: node.size)
      node.physicsBody?.affectedByGravity = false
      node.physicsBody?.allowsRotation = false
      node.physicsBody?.usesPreciseCollisionDetection = false
    }

override func sceneDidLoad() {
    physicsWorld.contactDelegate = self
    test.position = CGPoint(x: 0, y: 300)
    setActions()
    newPhysics(node: test)

    addChild(test)

}

override func didEvaluateActions() {
    newPhysics(node: test)
}

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if touchCnt == 0 {
            if !test.hasActions() {
                test.run(group1!)
                touchCnt += 1
            }
        } else {
            if !test.hasActions() {
                test.run(group2!)
                touchCnt -= 1
            }
        }
    }

, если вы поместите приведенный выше код в вашу gameScene, стараясь заменить любые дублирующиеся методы и заменяя текстуру тестового узла. затем, когда вы нажимаете на экран, спрайт должен анимироваться так, как вы хотите, при этом размер физического тела изменяется одновременно. Однако есть несколько проблем с производительностью. Как это меняет физическое тело на каждой игре l oop итерации.

...