2016-07-31 4 views
1

У меня есть объект, который нужно перемещать вверх и вниз по экрану. Когда вы сначала нажимаете кнопку, она перемещается вниз по экрану до конечной точки продолжительностью 3 секунды. Вы можете щелкнуть в любое время, чтобы остановить его от перемещения вниз и заставить его начать движение до другой конечной точки, снова в течение 3 секунд. Проблема с этим заключается в том, что если вы нажмете, чтобы переместить объект вниз, но затем сразу же нажмите снова, чтобы переместить его, объект движется вверх, но очень медленно, потому что он имеет продолжительность 3 секунды. (Надеюсь, это имеет смысл). Поэтому я хочу прекратить использовать продолжительность, чтобы установить темп/скорость, с которой движется объект. Есть ли способ сказать перейти к точке x.y на пустой скорости? Спасибо. (Независимо от того, где объект и должен перейти на Я хочу, чтобы всегда двигаться в том же темпе.)Перемещение объекта по экрану с определенной скоростью. (Sprite Kit)

Это то, что я использую, чтобы переместить объект прямо сейчас:

func moveObject(){ 
    let endpoint = CGPoint(x: self.size.width/2 , y: self.size.height/1.8888888888) 
    let moveObject = SKAction.moveTo(endpoint, duration: 3.0) 
    let moveObjectSequence = SKAction.sequence([moveLine]) 
    Object.runAction(moveLineSequence) 
} 

код после исправления :

func dropLine(){ 
    if hookNumber == 1{ 
     let endpoint = CGPoint(x: self.size.width/2 , y: self.size.height/1.8888888888) 
     let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishLine.position,pointB:endpoint,speed:300.0)) 
     let moveLineSequence = SKAction.sequence([moveLine]) 
     fishLine.runAction(moveLineSequence) 
    } 
} 

func dropHook(){ 
    if hookNumber == 1{ 
     let endpoint = CGPoint(x: self.size.width/2 , y: self.size.height - 2030) 
     let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishHook.position,pointB:endpoint,speed:300.0)) 
     let moveLineSequence = SKAction.sequence([moveLine]) 
     fishHook.runAction(moveLineSequence) 
      hookNumber = 2 
    } 
} 

func raiseLine(){ 
    if hookNumber == 2{ 
     let endpoint = CGPoint(x: self.size.width/2 , y: 3050) 
     let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishLine.position,pointB:endpoint,speed:300.0)) 
     let moveLineSequence = SKAction.sequence([moveLine]) 
     fishLine.runAction(moveLineSequence) 
    } 
} 

func raiseHook(){ 
    if hookNumber == 2{ 
     let endpoint = CGPoint(x: self.size.width/2 , y: self.size.height - 3) 
     let moveLine = SKAction.moveTo(endpoint, duration: getDuration(fishHook.position,pointB:endpoint,speed:300.0)) 
     let moveLineSequence = SKAction.sequence([moveLine]) 
     fishHook.runAction(moveLineSequence) 
    } 
} 

ответ

2

Я думаю, вы можете пересмотреть свой подход на основе скорости вычислений. Итак, если вы знаете свою скорость, вы можете рассчитать, сколько времени занимает узел, чтобы добраться до точки и изменить скорость на разумную величину.

// #-#-#-#-#-#-#-#-#-#-#-#-#-#-# 
//MARK: - Calculate action duration btw two points and speed 
// #-#-#-#-#-#-#-#-#-#-#-#-#-#-# 
func getDuration(pointA:CGPoint,pointB:CGPoint,speed:CGFloat)->NSTimeInterval { 
    let xDist = (pointB.x - pointA.x) 
    let yDist = (pointB.y - pointA.y) 
    let distance = sqrt((xDist * xDist) + (yDist * yDist)); 
    let duration : NSTimeInterval = NSTimeInterval(distance/speed) 
    return duration 
} 

Предположим, у вас есть узел со скоростью 150,0

Ваш ход будет:

let moveObject = SKAction.moveTo(endpoint, duration: getDuration(node.position,pointB:endpoint,speed:150.0)) 

С таким подходом вы скорость «не изменения, и вы не имеете эту неприятную медлительности ,

P.S. Не забывайте менять прописные буквы на свои свойства: в swift это плохое отношение, используйте объект вместо Object.

+0

@AlessandroOmano Я сделал это и решил проблему. Благодарю. Но это создало странный сбой. Сбой очень сложно объяснить, поэтому я собираюсь прикрепить ссылку к видео, которое показывает, что происходит сбой. Я также включу необходимый код. Вот ссылка на видео с ошибкой: https: //www.youtube.com/watch? V = jHE5RC-mvwU Сбой раньше не встречался. Вы знаете, почему это происходит, и если да, то что мне нужно сделать, чтобы остановить это? Я также добавлю новый код в исходное сообщение. – james

+0

Я видел как видео, так и ваш код. У меня такой опыт, когда я использовал такие великие ценности, как ты. Если вы сейчас, например, ваш топ равен self.frame.height-20, чтобы спрятать мяч, попробуйте использовать конечный результат, равный, например, self.frame.height + 40, не используйте гигантские значения, потому что вы могли бы типичный тип сбойного видео, то же самое применимо к нижней части –

+0

Ок. Когда вы говорите «гигантские ценности», вы имеете в виду конечные точки. Если это так, я изменил конечную точку на self.frame.height + 40, и глюк все же произошел. – james

Смежные вопросы