#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. спасибо за информацию! Я изменю это! К сожалению, у меня пока недостаточно репутации, чтобы проголосовать за него! Я пытался!