Ну, это была комбинация маленьких хаков в touchesBegan/ touchesMoved
и update
fun c,
Сначала вам нужно выяснить, какое касание произошло, получить его имя (в моем случае я сделал узлы, которые имеет альфа 0, но становится видимым при перемещении по ним, то есть альфа 1). В touchesBegan, touchesMoved
следующим образом
guard let touch = touches.first else {return}
let location = touch.location(in: self)
lastTouchPoint = location
let positionInScene = touch.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if let name = touchedNode.name
{
if name == "vortex"
{
touching = false
self.view!.isUserInteractionEnabled = false
print("Touched on the interacted node")
}else{
self.view!.isUserInteractionEnabled = true
touching = true
}
}
}
Второй используйте BOOL touching
для отслеживания взаимодействия с пользователем на экране, используя настройки распознавателя крана, как следует
func setupTapDetection() {
let t = UITapGestureRecognizer(target: self, action: #selector(tapped(_:)))
view?.addGestureRecognizer(t)
}
@objc func tapped(_ tap: UITapGestureRecognizer) {
touching = true
}
Наконец, в update
поставить чеки следующим образом,
guard isGameOver == false else { return }
self.view!.isUserInteractionEnabled = true
if(touching ?? true){
if let lastTouchPosition = lastTouchPoint {
//this usually gives a large value (related to screen size of the device) so /100 to normalize it
let diff = CGPoint(x: lastTouchPosition.x - player.position.x, y: lastTouchPosition.y - player.position.y)
physicsWorld.gravity = CGVector(dx: diff.x/100, dy: diff.y/100)
}
}
}