脉冲SKSpriteNode取决于触摸的位置Swift 2

我正在学Swift 2,而且我正在做一个典型的球类比赛,在这里你会发现一个冲动。 但我不想让球总是直接通过Y坐标,这不会很好玩,我想添加一个冲动取决于触摸的位置,通过相反的方向。

我试图用ABakerSmith给OP的这个例子 ,但是它做的只是把我的球在同一个地方旋转,然后把它移到一边。

所以我得到了这个代码,已经检测到球的雪碧触摸,工作正常。 像他提到的扩展CGVector。

我在这里做错了什么? 也许扩展CGVector的计算是错误的我的情况?

另外,我不得不认为它不应该向下移动,只能向上或向左或向右,而不能向下。

更新这是代码:

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) } 

这是扩展的CGVector代码:

 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 } }