Jaffer Sheriff
Jaffer Sheriff

Reputation: 1564

Move the SKSpriteNode to the actual touch point in ios Game

I have a SKSpriteNode, which is a ball. My view don't have gravity. I'm able to move the ball by applying an impulse over it in the start and I want to make it to move to the user touch point which we can get in -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event method without affecting its motion.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    for (UITouch *touch in touches)
        {
            CGPoint location = [touch locationInView:self.view];
            SKAction *moveToPoint = [SKAction moveByX:location.x y:location.y duration:2];

            [ball runAction:moveToPoint];
        }
}

Its not seems to be working. Help me guys.

Upvotes: 1

Views: 510

Answers (1)

ZeMoon
ZeMoon

Reputation: 20274

If you want to send the node directly to a point use the method:

[SKAction moveTo:location duration:2];

The SKAction moveBy: method moves the node by the x and y values provided, whereas the moveTo method to the point in the node's parent.

EDIT:

Also, change the line:

CGPoint location = [touch locationInView:self.view];

to

CGPoint location = [touch locationInNode:self];

A UIView has a different coordinate system than a SKScene.

EDIT 2: You can remove affect of physics while touch exists

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    for (UITouch *touch in touches)
        {
            ball.physicsBody.dynamic = NO;

            CGPoint location = [touch locationInNode: self];
            SKAction *moveToPoint = [SKAction moveTo:location duration:2];

            [ball runAction:moveToPoint];
        }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    ball.physicsBody.dynamic = YES;
}

Upvotes: 1

Related Questions