Установите минимальную скорость прокатки - PullRequest
0 голосов
/ 25 октября 2018

У меня есть шар, который я запускаю в воздух:

enter image description here

И он инициализируется так:

func initBallNode() {
    // TODO: Create ball node
    ballNode = SKSpriteNode(imageNamed: "Ball1") // Create a ball
    ballNode.zPosition = ZPositions.ball
    let offsetFromCorner: CGFloat = 20 // Offset from bottom-left of screen
    ballNode.position = CGPoint(x: frame.minX + ballNode.size.width / 2 + offsetFromCorner, y: frame.minY + ballNode.size.height / 2 + offsetFromCorner)
    ballNode.physicsBody = SKPhysicsBody(circleOfRadius: ballNode.size.width / 2)
    ballNode.physicsBody?.affectedByGravity = true
    ballNode.physicsBody?.angularDamping = 1 // <-- Does not set a minimum-speed

    addChild(ballNode)
}

Как я могу уменьшить минимальную скорость / скорость шара, чтобы он меньше катился и достиг полной остановки раньше?

Есть ли физические свойства?Чтобы справиться с этим, не влияя на массу объекта (заставляя его упасть раньше)?


Если у вас есть какие-либо вопросы, пожалуйста, задавайте!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Это еще не ответ.Это имеет проблемы, которые все еще идут вместе с ним, описанные в редактировании (ях) ниже исходного ответа.


Из-за хранимые свойства в расширениях Swift не разрешены (что приводит к небольшому значению в Objective-C), это было сделано немного сложнее.Однако после некоторого исследования и тестирования я нашел решение, которое на данный момент хорошо работает:

import SpriteKit


// Key to access the stored properties
private var minimumSpeedAssociatedKey: UInt8 = 0

extension SKPhysicsBody {

    // Minimum speed for each node
    var minimumSpeed: CGFloat? {
        get { return objc_getAssociatedObject(self, &minimumSpeedAssociatedKey) as? CGFloat }
        set(newValue) { objc_setAssociatedObject(self, &minimumSpeedAssociatedKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
    }

    // Update the speed for each node
    func updateSpeed() {
        guard let safeMinimumSpeed = minimumSpeed else {
            assert(false, "You have tried to update an object speed, without setting the minimum for the node: \"\(self.node?.description ?? "Unavailable")\".")
        }
        let currentSpeed = sqrt(pow(velocity.dx, 2) + pow(velocity.dy, 2))
        if currentSpeed < safeMinimumSpeed && currentSpeed > 0 {
            angularVelocity = 0
            velocity = CGVector(dx: 0, dy: 0)
        }
    }

}

Поместите это в файл Swift в своем проекте.Затем вы можете установить минимальную скорость:

ballNode.physicsBody?.minimumSpeed = 30

Затем переопределите функцию обновления следующим образом:

override func didFinishUpdate() {
    ballNode.physicsBody?.updateSpeed()
}

В результате шар теперь больше не катится ниже скорости30, и он останавливается вместо этого.Остановка по-прежнему почти незаметна, так как предыдущий мяч шел очень медленно в течение 5-секундного периода.Это результаты, которые я искал.

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


Редактировать 1:

Теперь у меня изменяемая местность.Однако, это вызывает странную физику, когда мяч откатывается назад, когда он ударяет по холму.Поэтому это не полностью решенная проблема.

0 голосов
/ 25 октября 2018

Вы можете увеличить friction из physicsBody.По умолчанию трение составляет 0,2, но оно может варьироваться от 0,0 до 1,0

.
...