У меня есть SKSpriteNode, в котором я установил свойство centerRect
, чтобы узел можно было растянуть, чтобы он выглядел как стилизованная линия. Я хочу, чтобы пользователь коснулся экрана и нарисовал / перетащил прямую линию с узлом. Линия будет поворачиваться вокруг точки привязки, чтобы оставаться прямыми.
В touchesBegan:
добавлен узел:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let positionInScene = touch.location(in: self)
if let _ = fgNode.childNode(withName: "laser") {
print("already there")
} else {
laser.centerRect = CGRect(x: 0.42857143, y: 0.57142857, width: 0.14285714, height: 0.14285714)
laser.anchorPoint = CGPoint(x: 0, y: 0.5)
laser.position = positionInScene
fgNode.addChild(laser)
}
}
И скорректировано в touchesMoved:
:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let positionInScene = touch.location(in: self)
stretchLaserTo(positionInScene)
}
Узел растягивается и вращается с двумя функциями:
func stretchLaserTo(_ point: CGPoint) {
let offset = point - laser.anchorPoint
let length = offset.length()
let direction = offset / CGFloat(length)
laser.xScale = length
rotate(sprite: laser, direction: direction)
}
func rotate(sprite: SKSpriteNode, direction: CGPoint) {
sprite.zRotation = atan2(direction.y, direction.x)
}
Я думаю, что я на правильном пути. Линия вращается с моим прикосновением и расширяется, однако она чрезвычайно чувствительна и не остается с моим прикосновением. Может я ошибаюсь. Есть ли стандартная техника для выполнения чего-то подобного?
Пример этой работы можно увидеть здесь: https://imgur.com/A83L45i