Search code examples
swiftsprite-kittouchesmoved

SpriteKit - touchesMoved, aim crosshair


I have a spritenode and a crosshair node, i want when the player touch the spritenode and move the crosshair also moves.

  override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)


            var body = self.nodeAtPoint(location)

            if var name: String = body.name {

                if body.name == "aim-button" {

                    crossHair.position = CGPointMake(crossHair.position.x + 10, crossHair.position.y + 10)
                }

            }

        }
    }

The crosshair does get move but only in one direction, and i have no idea how to make it accurate depending on the space the touch moved to-from (which is obviously way smaller than what the crosshair should actually move on the screen) and the direction.


Solution

  •     for touch: AnyObject in touches {
            //Get the current position in scene of the touch.
            let location = touch.locationInNode(self)
            //Get the previous position in scene of the touch.
            let previousLocation = touch.previousLocationInNode(self)
            //Calculate the translation.
            let translation = CGPointMake(location.x - previousLocation.x, location.y - previousLocation.y)
            //Get the current position in scene of the crossHair.
            let position = crossHair.position
            // Get the bode touched
            var body = self.nodeAtPoint(location)
    
            if var name: String = body.name {
    
                if body.name == "aim-button" {
    
                    //Set the position of the crosshair to its current position plus the translation.
                    crossHair.position =  CGPointMake(position.x + translation.x * 2, position.y + translation.y * 2)
                    //Set the position of the body
                    body.position = location
                }
            }
        }    
    

    If the crosshair should move more distance than the touch, just multiply the translation by a factor (i'm using 2 in the example above).