根据触摸位置拖动SKSpriteNode

我试图在y轴上拖动一个精灵,但是根据触点在节点上的开始位置,使精灵“粘住”用户手指。 精灵当前正在拖动,但似乎是将精灵的锚点捕捉到节点内的触摸位置

我假设它与通过[touch locationInNode:selectedNode];获取节点内的[touch locationInNode:selectedNode]; 但我不确定从哪里去。

这是我目前的代码。

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { CGPoint location = [touch locationInNode:self]; SKNode *node = [self nodeAtPoint:location]; CGPoint newPosition = CGPointMake(node.position.x, location.y); if ([node.name isEqualToString:self.selectedNode] ) { if (newPosition.y > 230) { newPosition.y = 230; } node.position = newPosition; } } } 

您需要根据节点上的当前触摸位置来偏移newPosition。

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { CGPoint location = [touch locationInNode:self]; SKNode *node = [self nodeAtPoint:location]; if ([node.name isEqualToString:self.selectedNode] ) { CGPoint previousLocation = [touch previousLocationInNode:self]; float diff = location.y - previousLocation.y; CGPoint newPosition = CGPointMake(node.position.x, node.position.y + diff); if (newPosition.y > 230) { newPosition.y = 230; } node.position = newPosition; } } } 

有两种方法可以做到这一点。 下面的示例代码跟踪用户的触摸位置,并在更新方法期间将精灵移动到该位置。 您可以修改代码以仅在y轴或x轴上移动。

 @implementation MyScene { SKSpriteNode *object1; CGPoint destinationLocation; } -(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { [self createObject]; destinationLocation = CGPointMake(300, 150); } return self; } -(void)createObject { object1 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(50, 50)]; object1.position = CGPointMake(300, 150); [self addChild:object1]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; destinationLocation = [touch locationInNode:self.scene]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; destinationLocation = [touch locationInNode:self.scene]; } -(void)update:(CFTimeInterval)currentTime { float x = fabs(object1.position.x - destinationLocation.x); float y = fabs(object1.position.y - destinationLocation.y); float divider = 0; if(x > y) { divider = x; } else { divider = y; } float xMove = (x/divider)*8; // change number to increase or decrease speed float yMove = (y/divider)*8; // change number to increase or decrease speed if(object1.position.x > destinationLocation.x) object1.position = CGPointMake(object1.position.x-xMove, object1.position.y); if(object1.position.x < destinationLocation.x) object1.position = CGPointMake(object1.position.x+xMove, object1.position.y); if(object1.position.y > destinationLocation.y) object1.position = CGPointMake(object1.position.x, object1.position.y-yMove); if(object1.position.y < destinationLocation.y) object1.position = CGPointMake(object1.position.x, object1.position.y+yMove); } @end