[ios]SpriteKit/swift-二元运算符 ' >' 不能应用于 'CGVector' 的两个操作数

发布时间: 2017/4/3 20:50:49
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在我的游戏我需要比较 2 碰撞后的速度。这两个速度是在 CGVector (dx:,dy:) 格式。然而 Swift 3 不让我使用 '>' 和' <' 操作数,对它们进行比较。我如何能解决?代码如下所示︰

func didBegin(_ contact: SKPhysicsContact) {
    var firstBody = SKPhysicsBody()
    var secondBody = SKPhysicsBody()
    let ballNode = self.childNode(withName: ballName)
    let defaultSpeedX:CGFloat = 100
    let defaultSpeedY:CGFloat = -100
    let maxSpeed = CGVector(dx: defaultSpeedX * 3, dy: defaultSpeedY * 3)
    let minSpeed = CGVector(dx: defaultSpeedX / 2 , dy: defaultSpeedY / 2)

    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()

    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target1Bitmask {
        score += 20
        self.vc.scoreLabel.text = "Score: \(score)"
        let currentSpeedX = ballNode?.physicsBody?.velocity.dx
        let currentSpeedY = ballNode?.physicsBody?.velocity.dy
        let speedDouble = CGVector(dx: currentSpeedX! * 2, dy: currentSpeedY! * 2)

        if ballNode?.physicsBody?.velocity == maxSpeed {

            ballNode?.physicsBody?.velocity = maxSpeed

        } else if speedDouble < maxSpeed {

            ballNode?.physicsBody?.velocity = speedDouble

        } else if speedDouble > maxSpeed {

            ballNode?.physicsBody?.velocity = maxSpeed

        }

谢谢你

解决方法 1:

"速度"的矢量是实际上你矢量描述三角形的斜边。试试这个︰

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
    }
}

let aaa = CGVector(dx: 10, dy: 10)
let bbb = CGVector(dx: 13, dy: 12)

print(aaa > bbb)

具有此扩展名的地方,你会发现你现有的代码, } else if speedDouble < maxSpeed { ,将编译。

它是如何工作的?好吧,你作为一个向量的速度定义两个组件-水平速度, dx ,和垂直速度, dy 。如果你想象一下 dxdy 作为一个直角三角形的两个侧,向量的长度是直角三角形的斜边 (记住 Pythagorus) — — 这就是 hypot 返回。

扩展名为以上, <> 运营商现在比较 CGVector 对象的速度 (其中你可以愉快地重命名 length )。

官方微信
官方QQ群
31647020