我有球类精灵,我想能弹向其他精灵。现在,我在下面有一个函数TouchesMoved,但是它将我的精灵移动到屏幕上的任何触摸动作,当我想让我的用户第一次触摸这个精灵并将他们的手指指向目标时,它会导致这个精灵移动。这就是功能失调。任何帮助都将不胜感激!
编辑:我想让球的速度保持不变,不管电影的长度。没有被其他的答案所解决。
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
if firstTimerStarted == false {
let touch = touches.first as! UITouch
let touchLocation = touch.locationInNode(self)
sceneTouched(touchLocation)
}
发布于 2015-06-04 07:47:49
这应该能行,我只是从一个老项目中挖出来的。
CGFloat dt是用来改变运动的速度/功率的。
var touching = false
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let location = touch.locationInNode(self)
if sprite.frame.contains(location) {
touchPoint = location
touching = true
}
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let location = touch.locationInNode(self)
touchPoint = location
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
touching = false
}
override func update(currentTime: CFTimeInterval) {
if touching {
if touchPoint != sprite.position
{
let dt:CGFloat = 0.15
let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y)
let vel = CGVector(dx: distance.dx/dt, dy: distance.dy/dt)
sprite.physicsBody!.velocity = vel
}
}
}
编辑:它变得越强的原因是距离越远,因为向量是雪碧和触点之间的距离。尝试将其弹出作为更新函数。它应该工作..。
override func update(currentTime: CFTimeInterval) {
if touching {
if touchPoint != sprite.position
{
let pointA = touchPoint
let pointB = sprite.position
let pointC = CGPointMake(sprite.position.x + 2, sprite.position.y)
let angle_ab = atan2(pointA.y - pointB.y, pointA.x - pointB.x)
let angle_cb = atan2(pointC.y - pointB.y, pointC.x - pointB.x)
let angle_abc = angle_ab - angle_cb
let vectorx = cos(angle_abc)
let vectory = sin(angle_abc)
let dt:CGFloat = 15
let vel = CGVector(dx: vectorx * dt, dy: vectory * dt)
sprite.physicsBody!.velocity = vel
}
}
}
使用touchPoint (pointA)和雪碧的位置(pointB),我们可以创建一个角度。
atan2,是C语言中一个非常著名的函数,它产生了两点之间的夹角。但是,零度是在一个与往常不同的位置。
所以,我们需要我们自己的0度标记,我用点的右半部分作为我的标记。这是普通的0度排名:
因为它是在雪碧的位置右边,我们创建了一个点就在雪碧(pointC)的右边。
我们现在使用atan2来寻找角度。
为了从一个角度创建一个向量,我们只对x和y值使用cos和sin。
https://stackoverflow.com/questions/30635784
复制相似问题