ios - SpriteKit 在碰撞后保持恒定速度

标签 ios iphone swift xcode physics

我正在尝试制作我的第一个 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,以可视化的形式解释了这个问题: enter image description here

最佳答案

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

一种可能的解决方案是在您的场景中覆盖 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)
}

关于ios - SpriteKit 在碰撞后保持恒定速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133905/

相关文章:

iPhone:使用 Google 获取路线

ios - 无法识别的选择器 Swift 2 Purelayout Xcode7

iphone - iOS:更改后退按钮的色调?

ios - 苹果是否向免费应用程序的发行商收费?

iOS - 在父级插入 AnotherVC 后如何在 NavigationController 堆栈中找到 ChildVC

ios - iOS-将NSDictionary键值顺序添加到NSArray中

iphone - 如何修改媒体库中歌曲的歌曲信息(例如 ID3 标签、AAC 信息)?

ios - ngf-select 不适用于 iphone5

swift - 通用 curry map 功能

ios - 如何从 cellForRowAtIndexPath 获取 textField 上的边框线?