SpriteKit Inelasti c Скорость уменьшения столкновений - PullRequest
0 голосов
/ 14 апреля 2020

Я строю игру в понг / брейкер с мячом и нестати c блоками. Я бы хотел, чтобы шар никогда не прекращал движение, но всякий раз, когда он попадает в блок, он теряет скорость.

У меня есть restitusion = 1 для всех задействованных спрайтов, я пытался установить массу, равную друг другу, и плотность и трение = 0. Но мяч все еще теряет скорость при отскоке.

Когда мяч попадает в блок, я удаляю его в функции didBegin (contact :). Я также пытался отложить удаление, и это не помогло.

Я бы хотел, чтобы мяч имел постоянную скорость, но все же мог бы взаимодействовать с блоками, как позже я хотел бы добавить блоки, которые могут быть поражены, не будучи сразу сломаны. Таким образом, блоки не могут быть c, но мяч должен иметь постоянную скорость.

Мой код для создания узла шара:

    func ballNode(_ position: CGPoint?) -> SKSpriteNode {
        let node = SKSpriteNode()
        node.position = position == nil ? CGPoint(x: size.width/2, y: 100) : position!
        node.size = CGSize(width: 17, height: 17)

        //background
        let background = SKShapeNode(circleOfRadius: 8.5)
        background.fillColor = UIColor.white

        node.addChild(background)

        //physics
        node.physicsBody = SKPhysicsBody(circleOfRadius: 8.5)
        node.physicsBody?.allowsRotation = true
        node.physicsBody?.friction = 0
        node.physicsBody?.restitution = 1
        node.physicsBody?.linearDamping = 0
        node.physicsBody?.angularDamping = 0

        node.physicsBody?.categoryBitMask = BallCategory
        node.physicsBody?.contactTestBitMask = AddBlockBorderCategory | PaddleCategory
        node.physicsBody?.collisionBitMask = PaddleCategory | BlockCategory | BorderCategory

        return node
    }

Мой код для создания Узел блока:

    func createBlockNode() -> BlockNode {
        let width = (size.width-CGFloat(6*layout[0].count))/CGFloat(layout[0].count)
        let height = width*0.5
        let nodeSize = CGSize(width: width, height: height)
        let node = BlockNode(texture: nil, size: nodeSize)

        let background = SKShapeNode(rectOf: nodeSize)
        background.fillColor = .darkGray
        background.strokeColor = .lightGray

        //physics
        node.physicsBody = SKPhysicsBody(rectangleOf: nodeSize)
        node.physicsBody?.restitution = 1
        node.physicsBody?.allowsRotation = true
        node.physicsBody?.friction = 0
        node.physicsBody?.categoryBitMask = BlockCategory
        node.physicsBody?.contactTestBitMask = BallCategory

        node.addChild(background)
        return node
    }

И запись на экране: Запись на экране скорости проигрыша шара

Я запускаю мяч, используя это:

ball!.physicsBody?.applyForce(CGVector(dx: 0, dy: 50))
...