shuchi
shuchi

Reputation: 13

Snake game movement issue Spritekit

I am trying to create a basic snake game using Swift and Spritekit. I have a sprite moving on the screen and when i swipe it starts moving in the swipe direction. I do this in the update method where I change the position of the sprite based on the swipe direction, a set speed and a fixed duration.

e.g. direction.x * blockMovePerSecond * CGFloat(actionDuration)

I have the sprites following each other, however, as soon as i swipe and the first sprite changes direction, the one following it moves diagonally instead of first on the x-axis and then the y-axis like a normal snakes game.

I tried the following options:

Here's my move method code for the sprites following the first sprite (snake head):

{
   var temp:NSValue = lastNodeLocation // the lastnodelocation is from first sprite location
   var tempNodeDirection = lastNodeDirection
   let actionDuration = 1.0

   let distanceToMoveThisFrame = tempNodeDirection.CGPointValue() * blockMovePerSecond * CGFloat(actionDuration)
   var currentPosition = NSValue(CGPoint: blocksOfAlphabets[i].position)
   let beforeDistance = CGPoint(x: temp.CGPointValue().x - currentPosition.CGPointValue().x, y: temp.CGPointValue().y - currentPosition.CGPointValue().y)


   lastNodeLocation = NSValue(CGPoint: blocksOfAlphabets[i].position)
   // move node to new location
   var moveAction = SKAction.moveTo(temp.CGPointValue(), duration: 1.0)
   node.runAction(moveAction)
}

Can somebody please help?

Thanks Shuchi

Upvotes: 1

Views: 990

Answers (2)

Patrick Collins
Patrick Collins

Reputation: 4334

I think the easiest thing to do here is to keep an array of snake sprite components (let's call these sprites a "Rib").

Every 5 seconds add a new Rib to the end of the array to make the snake grow.

Then, each half second in the update() method (or however long you want it to be):

  • check for any swipes that have happened since the last update and change direction of the first rib (the snake head) in the direction of the swipe.

  • now run through the snake array in reverse and set the location of node (n) to the node position of node (n-1).

There are other ways you could do it but I think this would be the easiest.

Upvotes: 0

Christian
Christian

Reputation: 22343

Well your problem is that the runAction-methods don't wait to complete. So if you call another runAction-method while a sprite is already running an action, the new action will be started immediately.

You can work with sequences to finish the x-axis first: SKAction:sequence

Upvotes: 0

Related Questions