Steve Steve - 6 months ago 9
Swift Question

Changing collisionBitMask according to y value ascending or descending

Swift - SpriteKit

I am making my first game and I have my

var Player = SKSpriteNode()

and also
var platform = SKNode()


I want to detect when the player is increasing in y direction so i can turn off
collisionBitMask
. Therefore making it possible to jump up through platforms when jumping and when he is falling he will land on the platforms.

So I can have something like:

if player.position.y = increasing {
Player.physicsBody?.collisionBitMask = nil
}else{
Player.physicsBody?.collisionBitMask = PhysicsCategory.Platform
}


I have looked around and cannot find what I am after, unless I'm looking for the wrong thing.

Many thanks.

Edit: Solved check EmilioPelaez answer, just showing how I i slightly changed it here.

Declared
var lastY: CGFloat?
outside the functions with all my other variables.

override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
// Checking y direction
if Player.position.y > lastY {
// Player increasing in y direction
Player.physicsBody?.collisionBitMask = PhysicsCategory.Ground
} else {
// Player decreasing in y direction
Player.physicsBody?.collisionBitMask = PhysicsCategory.Ground | PhysicsCategory.Platform
}

lastY = Player.position.y
}

Answer

Basically, what you want to do is to compare the current value to the value in the previous frame.

The easiest way to do this is to make a variable where you can store the previous value, and use that to do the comparison. Once you have done the comparison you store the current value in that variable to be used next frame.

Something like this:

var lastY: CGFloat?

// in your function
if let lastY = lastY {
  if player.y > lastY {
    // player.y is increasing
  } else {
    // player.y is decreasing
  }
}
lastY = player.y