SpriteKit & Swift 3 - отскок не работает должным образом с узлом шара

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

Для этого я использовал функцию didBegin(contact) вместе и установил разные скорости, как это видно из кода ниже:

extension CGVector {
var speed: CGFloat {
    return hypot(dx, dy)
}

static func > (lhs: CGVector, rhs: CGVector) -> Bool {
    return lhs.speed > rhs.speed
}

static func < (lhs: CGVector, rhs: CGVector) -> Bool {
    return lhs.speed < rhs.speed
}

static func * (vector: CGVector, multiplier: CGFloat) -> CGVector {
    return CGVector(dx: vector.dx * multiplier, dy: vector.dy * multiplier)
}

static func / (vector:CGVector, divider:CGFloat) -> CGVector {
    return CGVector(dx: vector.dx / divider, dy: vector.dy / divider)
}
}

func didBegin(_ contact: SKPhysicsContact) {
    var firstBody = SKPhysicsBody()
    var secondBody = SKPhysicsBody()
    let ballNode = self.childNode(withName: ballName)
    let minSpeed = self.initialSpeed / 2
    let maxSpeed = self.initialSpeed * 3

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == drainBitmask {
        endGame()
        Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(GameScene.showLeaderboard), userInfo: nil, repeats: false)

    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target1Bitmask {
        let currentSpeed = ballNode?.physicsBody?.velocity
        score += 20
        self.vc.scoreLabel.text = "Score: \(score)"

        if currentSpeed == maxSpeed {

            ballNode?.physicsBody?.velocity = currentSpeed!

        } else if (currentSpeed! * 2) > maxSpeed {

            ballNode?.physicsBody?.velocity = maxSpeed

        } else if (currentSpeed! * 2) < maxSpeed {

            ballNode?.physicsBody?.velocity = currentSpeed! * 2

        }

    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target2Bitmask {
        let currentSpeed = ballNode?.physicsBody?.velocity
        score += 10
        self.vc.scoreLabel.text = "Score: \(score)"

        if currentSpeed == minSpeed {

            ballNode?.physicsBody?.velocity = currentSpeed!

        } else if (currentSpeed! / 2) > minSpeed {

            ballNode?.physicsBody?.velocity = currentSpeed! / 2

        } else if (currentSpeed! / 2) < minSpeed {

            ballNode?.physicsBody?.velocity = minSpeed

        }


    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target3Bitmask {
        let currentSpeed = ballNode?.physicsBody?.velocity
        score += 30
        self.vc.scoreLabel.text = "Score: \(score)"

        if currentSpeed == maxSpeed {

            ballNode?.physicsBody?.velocity = currentSpeed!

        } else if (currentSpeed! * 3) > maxSpeed {

            ballNode?.physicsBody?.velocity = maxSpeed

        } else if (currentSpeed! * 3) < maxSpeed {

            ballNode?.physicsBody?.velocity = currentSpeed! * 3

        }


    }

Иногда я сталкиваюсь с тем, что мяч сталкивается с целями, которые он отскакивает очень странным и нереалистичным образом, а иногда просто дает сбой (пожалуйста, проверьте ссылку ниже для короткого видеоролика, который показывает, что я имею в виду)

Примечание: на 2/3 секундах в видео пример странного скачка

https://drive.google.com/open?id=0BxgQmn_JruJ_aUU2dVBoVlprV0k

Почему это происходит, и что более важно, как я могу это исправить?

PS: Я полагаю, что причиной этого может быть то, что вектор скорости контролирует как угол (направление), так и скорость (я думаю) шара, поэтому, когда я устанавливаю скорость, направление не учитывается. Если бы это было причиной, можно ли было бы утроить / удвоить / уменьшить скорость вдвое, при этом делая реалистичный отскок?

0 ответов

Другие вопросы по тегам