【问题标题】:SKSpriteKit maintaining constant velocity after collisionSpriteKit 在碰撞后保持恒定速度
【发布时间】:2018-05-30 03:59:31
【问题描述】:

我正在尝试制作我的第一个 iOS 应用程序,但目前遇到了问题。

在我的游戏中,当球弹起时,我希望它以相同的速度弹回相同的高度。目前它做得很好。但是,当我旋转六边形并碰到一个角度时,它最终会失去速度并且不会弹回相同的高度。

所以我的问题是:我如何迫使球在碰撞时保持相同的速度?

这是我的 Ball 节点的代码:

func createBallNode(ballColor: String) -> SKSpriteNode {
    let ball = SKSpriteNode(imageNamed: ballColor)
    ball.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)+30)
    ball.zPosition = 1

    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2)
    ball.physicsBody?.affectedByGravity = true
    ball.physicsBody?.restitution = 1
    ball.physicsBody?.linearDamping = 0
    ball.physicsBody?.friction = 0

    ball.physicsBody?.categoryBitMask = ColliderType.Ball.rawValue
    ball.physicsBody?.contactTestBitMask = ColliderType.Rect.rawValue
    ball.physicsBody?.collisionBitMask = ColliderType.Rect.rawValue

    let centerX = ball.position.x
    let range = SKRange(lowerLimit: centerX, upperLimit: centerX)

    let constraint = SKConstraint.positionX(range)
    ball.constraints = [constraint]

    return ball
}

下面是一个 GIF,以视觉形式解释了这个问题:

【问题讨论】:

    标签: ios iphone swift xcode physics


    【解决方案1】:

    问题在于,如果球以一定角度碰撞,它的总速度会在新速度向量的垂直分量和水平分量之间分配。因为您限制了球水平位置的运动,所以水平速度会丢失,球不会反弹得那么高。

    一种可能的解决方案是在您的场景中覆盖didSimulatePhysics,并检查球的速度是否不足以使其达到所需的高度。如果不是,请增加它的速度,这样它就可以了。

    let neededVelocity = sqrt(2 * physicsWorld.gravity.dy * (intendedHeight - ball.posiiton.y))
    if ball.physicsBody.velocity.dy < neededVelocity && ball.physicsBody.velocity.dy > 0 {
        ball.physicsBody.velocity = CGVector(dx: 0, dy: neededVelocity)
    }
    

    【讨论】:

    • 'intentedHeight' 的值是多少?那么如果高度应该是屏幕的中间,我给它什么呢?
    • @JimmyLee 这可能只是六边形的中心。如果那也是场景的中心,你可以使用let intendedHeight = view.frame.midY
    • 不幸的是,这并没有帮助我解决我的问题:/
    【解决方案2】:

    我不确定您是否还在寻找答案,但是...

    如果你总是希望球在同一垂直方向上弹跳,那你为什么不呢:

    • 在六边形的底线所在的位置创建一个水平 SKShapeNode。
    • 将填充和描边颜色设置为“清除”。
    • 为其设置物理体 - 以便球在其上反弹。
    • 从彩色六边形中移除实体。

    这将避免任何“角度反弹”问题。

    如果您想检测与相关六边形形状的接触,您可以跟踪底部的内容,或者:

    • 将新的物理框向下移动 1 点。
    • 为您的六边形形状添加接触面罩(不是“碰撞”),这样您就可以接触到但不会发生物理碰撞。

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多