Impulso SKSpriteNode, dependendo da localização tocada Swift 2
Estou aprendendo o Swift 2 e estou fazendo o típico jogo de bola em que você bate na bola, é um impulso. Mas não quero que a bola passe sempre pela coordenada Y, não seria divertido, gostaria de adicionar um impulso dependendo da localização tocada, seguir na direção oposta.
Eu tentei issoexemplo que o ABakerSmith deu ao OP, mas o que ele faz é girar minha bola no mesmo lugar e quase movê-la para um lado.
Então eu peguei esse código, já detectando a bola Sprite touch, funcionando bem. CGVector estendido como ele mencionou.
O que eu estou fazendo errado aqui? talvez os cálculos no CGVector estendido estejam errados no meu caso?
Também tenho que considerar que não deve se mover para baixo, apenas para cima e ambas as direções para a esquerda ou direita, mas não para baixo.
ATUALIZADA Este é o código:
ball = SKSpriteNode(imageNamed: "ball")
ball.name = ballCategoryName
ball.userInteractionEnabled = false
ball.setScale(0.3)
ball.zPosition = 2
ball.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width / 2)
ball.physicsBody?.friction = 0
ball.physicsBody?.restitution = 0.7
ball.physicsBody?.linearDamping = 0
ball.physicsBody?.allowsRotation = true
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
ball.physicsBody?.dynamic = true
ball.physicsBody?.affectedByGravity = false
self.addChild(ball)
/* during touchesBegan func() */
if node.name == "ball" {
score += 1
scoreLabel.text = "\(score)"
ball.physicsBody?.velocity = CGVectorMake(0, 0);
let ballCenter = CGVectorMake(ball.position.x + ball.frame.width / 2,
ball.position.y + ball.frame.height / 2)
let reflectedPoint = CGVectorMake(2 * ballCenter.dx - location.x,
2 * ballCenter.dy - location.y)
print(location.x, location.y, " vs ", reflectedPoint.dx, reflectedPoint.dy)
ball.physicsBody?.applyImpulse(reflectedPoint, atPoint: location)
}
E este é o código CGVector estendido:
import Foundation
import SpriteKit
extension CGVector {
init(p1: CGPoint, p2: CGPoint) {
self.dx = p1.x - p2.x
self.dy = p1.y - p2.y
}
var length: CGFloat {
get { return hypot(dx, dy) }
set {
normalise()
dx *= newValue
dy *= newValue
}
}
mutating func normalise() {
dx /= length
dy /= length
}
}