'How do I stop physicsbody's from falling in SpriteKit?

I am making a game in Swift using spritekit and I want 2 objects on screen, one that I move with the touchesMoved function (player) and the other to stay still in its position in the screen (cell).

I wanted to make the objects physicsbody's so that I could work out collisions between them, but now whenever the scene loads the objects fall straight away. And the object moved through touch falls as soon as the user stops touching the screen.

Here's all of the code relating to the object that should stay stationary in the scene and I am unsure what makes it fall.

 //Defining the cell
let cell = SKSpriteNode(imageNamed: "cell.png")

override func didMove(to view: SKView){

    self.physicsWorld.contactDelegate = self 

    cell.physicsBody?.categoryBitMask = cellCategory
    cell.physicsBody?.contactTestBitMask = playerCategory
    cell.physicsBody?.isDynamic = true
    cell.physicsBody = SKPhysicsBody(rectangleOf: cell.frame.size)

//Adding the cell to the scene
    cell.position = CGPoint(x:size.width * 0.9, y:size.height * 0.9)
    cell.size = CGSize(width: 50, height: 50)
    addChild(cell)

Any help in what makes the object fall and how I can stop it from happening would be greatly appreciated.



Solution 1:[1]

Gravity is by default on. You can either turn it off entirely by setting the gravity property of the scene's physicsWorld:

// somewhere in the scene's initialization, or in didMove if you like
physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)

See https://developer.apple.com/documentation/spritekit/skphysicsworld for info on that.

Or you can turn off whether individual objects are affected by gravity. E.g.,

let body = SKPhysicsBody(circleOfRadius: 10.0)
body.affectedByGravity = false

See https://developer.apple.com/documentation/spritekit/skphysicsbody, and in particular, https://developer.apple.com/documentation/spritekit/skphysicsbody/1519774-affectedbygravity

You have a different problem in that you're setting the properties of your cell's physics body before you're creating it. cell.physicsBody?... = will not assign anything until cell.physicsBody exists. So those assignments must be moved after you create cell.physicsBody = SKPhysicsBody(rectangleOf: ...)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1