Working from the trigonometry example I wanted to repurpose the laser logic to the ship’s movement, to control the ship with swipes in all directions, in place of the default N/S/E/W UISwipeGestureRecognizer.
Using the trigonometry example I would be able to add custom easing/tweening at the beginning and end of the movement. The idea being to swipe anywhere on screen to control a node.
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let touchTimeThreshold: CFTimeInterval = 0.3
let touchDistanceThreshold: CGFloat = 1 // if the swipe distance is less then it is registered as a tap event
var destination = CGPoint.zero
var moveDistance: CGFloat = 20
guard CACurrentMediaTime() - touchTime < touchTimeThreshold,
let touch = touches.first else { return }
let location = touch.location(in: self)
let swipe = CGVector(dx: location.x - touchLocation.x, dy: location.y - touchLocation.y)
let swipeLength = sqrt(swipe.dx * swipe.dx + swipe.dy * swipe.dy)
guard swipeLength > touchDistanceThreshold else { return }
let angle = atan2(swipe.dy, swipe.dx) // convert the swipe vector to an angle
//access the sprite node on the Entity
guard let spriteComponent = hero.component(ofType: SpriteComponent.self) else { return }
if swipe.dy > 0 {
destination.y = moveDistance
} else {
destination.y = -moveDistance
}
destination.x = spriteComponent.node.position.x +
((destination.y - spriteComponent.node.position.y) / swipe.dy * swipe.dx)
if swipe.dx > 0 {
destination.x = moveDistance
} else {
destination.x = -moveDistance
}
destination.y = spriteComponent.node.position.y +
((destination.x - spriteComponent.node.position.x) / swipe.dx * swipe.dy)
spriteComponent.moveAnimation(theXAmount: destination.x, theYAmount: destination.y, theAnimation: "walkLeft")
}
However, it doesn’t work much beyond five swipes, as they add up the previous numbers on either x/y axis, and often the ship will get stuck on the side of the screen.
Basically I am looking for diagonal swipe gestures and thought that trig would be the way to achieve that.
Is it possible to subclass Apple’s UISwipeGestureRecognizer to add diagonal functionality ?
I also found that the UITapGestureRecognizer in touchesEnded would conflict with touchesMoved. The trigonometry example could solve this.