Marc Julian
Marc Julian

Reputation: 23

Swift Sprite Kit Physics Body: Ball slows down after applying an impulse

I am quite new to Swift and the Sprite Kit!

I tried to build a Pong game. Everything works well but the ball on which I am applying an impulse slows down really quickly! I already turned off gravity, friction and damping and set the restitution of the ball and the scene to 1.

Here is my Code:

import SpriteKit
import GameplayKit

class GameScene: SKScene {
    
  let player = SKShapeNode(rectOf: CGSize(width: 200, height: 30))
  let enemy = SKShapeNode(rectOf: CGSize(width: 200, height: 30))
  let ball = SKShapeNode(circleOfRadius: 10)

override func didMove(to view: SKView) {

let border = SKPhysicsBody(edgeLoopFrom: self.frame)
    border.restitution = 1
    border.friction = 0
    border.angularDamping = 0
    border.linearDamping = 0

    self.physicsBody = border

    scene?.physicsWorld.gravity = CGVector(dx: 0, dy: 0)

    player.position = CGPoint(x:  0, y: -(scene?.size.height)! * 0.35)
    player.fillColor = UIColor.white
    player.strokeColor = UIColor.clear
    self.addChild(player)

    player.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 200, height: 30))
    player.physicsBody?.friction = 0
    player.physicsBody?.isDynamic = false
    player.physicsBody?.angularDamping = 0
    player.physicsBody?.linearDamping = 0
    player.physicsBody?.restitution = 1
    player.physicsBody?.affectedByGravity = false

    enemy.position = CGPoint(x: 0, y: (scene?.size.height)! * 0.35)
    enemy.fillColor = UIColor.white
    enemy.strokeColor = UIColor.clear
    self.addChild(enemy)

    enemy.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 200, height: 30))
    enemy.physicsBody?.friction = 0
    enemy.physicsBody?.affectedByGravity = false
    enemy.physicsBody?.linearDamping = 0
    enemy.physicsBody?.angularDamping = 0
    enemy.physicsBody?.isDynamic = false

    ball.position = CGPoint(x: 0, y: 0)
    ball.fillColor = UIColor.white
    ball.strokeColor = UIColor.clear

    ball.physicsBody?.angularDamping = 0
    ball.physicsBody?.linearDamping = 0
    ball.physicsBody?.friction = 0
    ball.physicsBody?.restitution = 1
    ball.physicsBody?.allowsRotation = false
    ball.physicsBody?.affectedByGravity = true
    ball.physicsBody = SKPhysicsBody(circleOfRadius: 10)
    ball.physicsBody?.isDynamic = true
    self.addChild(ball)
    ball.physicsBody?.applyImpulse(CGVector(dx: -30, dy: -30))



  }

   override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {

        let pos = touch.location(in: self)

        player.position.x = pos.x

     }
  }

    override func update(_ currentTime: TimeInterval) {
         if ball.position.y >  0{
         enemy.position.x = ball.position.x
         }
    }
 }

Thank you already!

Upvotes: 2

Views: 336

Answers (1)

Knight0fDragon
Knight0fDragon

Reputation: 16827

Be sure to always create your physics body before you change its properties

ball.physicsBody?.angularDamping = 0
ball.physicsBody?.linearDamping = 0
ball.physicsBody?.friction = 0
ball.physicsBody?.restitution = 1
ball.physicsBody?.allowsRotation = false
ball.physicsBody?.affectedByGravity = true
ball.physicsBody = SKPhysicsBody(circleOfRadius: 10) <----Needs to be first
ball.physicsBody?.isDynamic = true
self.addChild(ball)
ball.physicsBody?.applyImpulse(CGVector(dx: -30, dy: -30))

Upvotes: 1

Related Questions