Я понял твою проблему.
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 итерации.