You know when the button is pressed because touchesBegan is called. Then you need to set a flag to indicate that the button is pressed.
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { let touch = touches.first! if leftButton.containsPoint(touch.locationInNode(self)) { leftButtonIsPressed = true } if rightButton.containsPoint(touch.locationInNode(self)) { rightButtonIsPressed = true } }
In update() call a function that is true:
update() { if leftButtonIsPressed == true { moveLeft() } if rightButtonIsPressed == true { moveRight() } }
You set the flag false if touchesEnded is called for this button:
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { let touch = touches.first! if leftButton.containsPoint(touch.locationInNode(self)) { leftButtonIsPressed = false } if rightButton.containsPoint(touch.locationInNode(self)) { rightButtonIsPressed = flase } }
Edit:
As KoD pointed out, a cleaner way to do this (for the navigation buttons) is with SKAction , which eliminates the need for a flag:
- Define
SKActions for moveTo x:0 and moveTo x:frame.width in didMoveTo(View:) - In
touchesBegan run the correct SKAction on the correct object, specifying the key for SKAction. - In
touchesEnded remove the corresponding SKAction.
You will need to do some mathematical calculations to calculate how many points your object will move, and then set the duration for SKAction based on this distance and speed (in points per second).
Alternatively (thanks to KnightOfDragons for this) create an SKAction.MoveBy x: that moves a short distance (based on the desired speed) and lasts 1/60 seconds. Repeat this action permanently ( SKAction.repeatForever ) when the button touches and remove the repeating SKAction when the button is released.
source share