HelloimDarius
HelloimDarius

Reputation: 695

How to pan without touch action getting executed in Sprite Kit?

In touchesBegan I have my logic for single touch. And I'm trying to add ability to change camera position with pan. For pan I use touchesMoved. Everything is kind of okay, but once I pan, action for touch gets executed too.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];

        NSArray *sprites = [self nodesAtPoint:location];
        for (SKSpriteNode *sprite in sprites)
        {
            //*
            //*  How to stop executing this block when panning? 
            //*
        }

    }
}

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint positionInScene = [touch locationInNode:self];
    CGPoint previousPosition = [touch previousLocationInNode:self];
    CGPoint translation = CGPointMake((-1)*(positionInScene.x - previousPosition.x), (-1)*(positionInScene.y - previousPosition.y));
    CGPoint cameraPos = [self camera].position;

    [self camera].position = CGPointAdd(cameraPos, translation);

}

Upvotes: 1

Views: 90

Answers (1)

Knight0fDragon
Knight0fDragon

Reputation: 16837

Look at how to use the Pan Gesture that is built into IOS, with it you will have to option to allow it to also execute the touch event or not.

I will give you an answer using the view controller, you may use it somewhere else though

Objective C:

Open up ViewController.h and add the following declaration:

@interface ViewController : UIViewController<UIGestureRecognizerDelegate>

...

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer;

Then implement it in ViewController.m as follows:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
                                     recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

}

http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more

At this point you can link it via UI like in the tutorial above, or declare somewhere in the beginning

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self.view addGestureRecognizer:pan];

Swift:

class ViewController : UIViewController, UIGestureRecognizerDelegate

... then in your code

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
  let translation = recognizer.translationInView(self.view)
  if let view = recognizer.view {
    view.center = CGPoint(x:view.center.x + translation.x,
                          y:view.center.y + translation.y)
  }
  recognizer.setTranslation(CGPointZero, inView: self.view)
 }

http://www.raywenderlich.com/76020/using-uigesturerecognizer-with-swift-tutorial

At this point you can link it via UI like in the tutorial above, or declare somewhere in the beginning stages like init:

let pan = UIPanGestureRecognizer(target: self, action: "handlePan:")
self.view.addGestureRecognizer(pan);

Upvotes: 2

Related Questions