 <p>The following demonstrates how to 1) select a sprite that is within a specified distance from a touch event and 2) drag and drop the selected sprite to a new location.</p> <pre><code>@interface MyScene() @property (weak) SKSpriteNode *selectedNode; @end @implementation MyScene -(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { /* Setup your scene here */ self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0]; // Add three sprites to scene SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(32, 32)]; sprite.name = @"Blue"; sprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)-64); [self addChild:sprite]; sprite = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(32, 32)]; sprite.name = @"Red"; sprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) + 64); [self addChild:sprite]; sprite = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(32, 32)]; sprite.name = @"Green"; sprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); [self addChild:sprite]; } return self; } #define kRadius 64 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { _selectedNode = nil; CGFloat minDistance = kRadius+1; for (UITouch *touch in touches) { CGPoint location = [touch locationInNode:self]; for (SKSpriteNode *node in self.children) { CGFloat dx = location.x - node.position.x; CGFloat dy = location.y - node.position.y; // Compute distance from sprite to tap point CGFloat distance = sqrtf(dx*dx+dy*dy); if (distance &lt;= kRadius) { if (distance &lt; minDistance) { // Select the closest node so far _selectedNode = node; minDistance = distance; } } } } } - (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInNode:self]; if (_selectedNode) { // Move selected node to current touch position _selectedNode.position = location; } } - (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // Unselect node _selectedNode = nil; } - (void) update:(CFTimeInterval)currentTime { /* Called before each frame is rendered */ } @end </code></pre>