Как сделать так, чтобы одна линия следовала за касанием, а не рисовала бесконечно в spritekit?

#swift #xcode #sprite-kit #skshapenode

Вопрос:

Я пытаюсь провести одну единственную прямую линию по своему пальцу после того, как я коснусь определенного объекта спрайта. До сих пор у меня это работало, за исключением того, что вместо одной нарисованной линии, после прикосновения рисуются бесконечные линии…

Мой Код:

 import SpriteKit import GameplayKit  class WireDrawTest: SKScene{      var drawingLayer: CAShapeLayer!  var redBox = SKSpriteNode()  var redBoxPoint = CGPoint(x: 445, y: 800)  var redBoxTouched:Int = -1    var currentTouch = touchesMoved    func drawLine(from: CGPoint, to: CGPoint) {  let line = SKShapeNode()  let path = CGMutablePath()  path.addLines(between: [from, to])  line.path = path  line.strokeColor = UIColor.yellow  line.lineWidth = 13  addChild(line)  }    override func didMove(to view: SKView) {  redBox = self.childNode(withName: "redBox") as! SKSpriteNode  }    override func touchesBegan(_ touches: Setlt;UITouchgt;, with event: UIEvent?) {  print(redBoxTouched)  }    override func touchesMoved(_ touches: Setlt;UITouchgt;, with event: UIEvent?) {    let touch = touches.first    if let location = touch?.location(in: self){  let nodesArray = self.nodes(at: location)    if nodesArray.first?.name == "redBox" {  if redBoxTouched == -1 {  redBoxTouched = 1  }  }    if redBoxTouched == 1 {  drawLine(from: redBoxPoint, to: location)  }    }    }    override func touchesEnded(_ touches: Setlt;UITouchgt;, with event: UIEvent?) {  print(redBoxTouched)  if redBoxTouched == 1 {  redBoxTouched = -1  }  }  }   

Это скриншот текущего результата: скриншот

ТИА!!

Комментарии:

1. «вместо того, чтобы провести одну-единственную линию» Из какой точки в какую точку? Если вы просто хотите провести прямую линию, разве это не просто вопрос соединения одной точки с touchesBegan другой touchesEnded ?

2. Я не уверен. Я новичок в swift lol. Но я не пытаюсь, чтобы «рисунок» остался после того, как прикосновение закончилось. Я хочу, чтобы линия исчезла при прикосновении, но это не то, с чем я борюсь. Я хочу, чтобы одна строка следовала за вашим пальцем, когда вы касаетесь экрана, вместо того, чтобы непрерывно печатать строки.

Ответ №1:

Каждый раз , когда вы звоните drawLine , вы создаете новый узел формы и добавляете его в сцену. Однако вы никогда не удаляете ни один из этих узлов формы, поэтому количество линий увеличивается по мере того, как вы двигаете пальцем.

Одно из исправлений состоит в том, чтобы иметь дополнительный узел формы, который запоминает предыдущую строку, если таковая имеется. Затем просто удалите и отбросьте предыдущий узел формы, если он есть, всякий раз, когда происходит касание. И когда прикосновение закончится, удалите линию.

Или вы можете создать один узел формы и добавить его в сцену, когда начинается касание, изменить его путь по мере перемещения касания и удалить его из сцены, когда касание заканчивается. Если я правильно помню, узел формы создает внутреннюю копию пути, поэтому простое наличие изменяемого пути и изменение пути не приведет к обновлению узла формы. Но я верю, что вы можете создать новый путь и назначить свойство узла формы path для обновления узла.

Комментарии:

1. Спасибо, я попробую это сделать!

Ответ №2:

Я нашел решение этой проблемы благодаря настройкам bg2b, которые направили меня на правильный путь…

Прежде всего, вместо того, чтобы «let line = SKShapeNode» содержался внутри функции drawWire, он должен находиться вне ее, в основной настройке сцены.

Оттуда я просто добавил «line.removeFromParent» в touchesEnded. Теперь это работает! Я не знаю, почему это работает, но это работает! ЛОЛ!

Комментарии:

1. Привет! В этом случае вы должны принять его ответ (bg2b), а не свой ответ (где вы даже заявляете, что не знаете, как это работает). Также приятно проголосовать за полезные ответы соответственно. Это может быть изменение вашего вопроса, а не ответ (поставьте в конце вопроса то, что действительно сработало для вас, но поскольку вы не можете документировать, это не должно быть ответом) 🙂

2. спасибо за информацию! Я изменю это! К сожалению, у меня пока недостаточно репутации, чтобы проголосовать за него! Я пытался!