二元运算符 (*) 不能应用于操作数 CGPoint 和 CGFloat

Binary operator (*) cannot be applied to operands CGPoint and CGFloat

我正在尝试为玩家添加重力和速度,但无法修复此错误。我尝试了多种不同的方法,但总是遇到相同类型的错误。谁能告诉我我做错了什么以及为什么不能使用乘法 CGPointCGFloatCGFloat * CGFloatCGPoint * CGPoint?

您可以使用运算符重载来执行此操作。

func *(lhs: CGPoint, rhs: CGFloat) -> CGPoint {
    return CGPoint(x: lhs.x * rhs, y: lhs.y * rhs)
}

根本不可能将 CGPoint 与 Float 相乘。第一个是点,第二个是数字。在现实生活中,你不能将你所站的坐标乘以一个数字。但是,您可以做的是将坐标的每个轴自身相乘,然后用结果创建一个新点。

我不确定您要做什么,但我只是将这些行更改为:

let gravityStep = CGPoint(x: 0, y: gravity * seconds)
let velocityStep = CGPoint(x: velocity.x * seconds, y: velocity.y * seconds)

这应该会按预期工作。

声明此扩展程序

extension CGPoint {
    static func * ( left : CGPoint , right : CGFloat) -> CGPoint {
        return CGPoint(x: left.x * right, y: left.y * right)
    }

    static func * ( left : CGFloat , right : CGPoint) -> CGPoint {
        return CGPoint(x: right.x * left, y: right.y * left)
    }
}

假设您在 iOS 上工作,建议查看 Core Motion api,如 UIGravityBehavior、CMAcceleration、CGVector。抱歉,我知道这不能直接回答您的问题,但希望对您有所帮助:)

这篇文章似乎安排得很好: https://www.bignerdranch.com/blog/uidynamics-in-swift/

一般来说,如果你想直接实现重力,你应该看看矢量数学。并且可能使用辅助库,例如 https://github.com/nicklockwood/VectorMath(免责声明:我没有参与这个库,这只是一个例子)

我注意到您正在阅读 Ray Wenderlich 的 "How to make a game like Flappy Bird" 教程,其中在名为 SKUtils 的文件中包含一些辅助方法。当您添加来自 Ray Wenderlich 的 SKUtils 文件时,您可能必须确保它们已在 "Target Membership" 中签入。不应该,但我相信这取决于您将它们拖入 xcode 时所选择的内容。在这种情况下,这就是导致错误 "Binary operator (*) cannot be applied to operands CGPoint and CGFloat" 的原因。这里的其他答案将帮助您理解问题,并学会自己解决错误,但我假设您只想解决问题,这样您就可以继续本教程。这同样适用于许多其他借用代码和文件的情况。