2

我有一个简单的突破游戏,其中包含一个节点,即球和其他一些对象。问题是当球以非常小的角度反弹到墙上时,它不会反弹回来,它只是无限期地在墙上滑动。

接触后手动计算角度可以解决问题,但使用SpriteKit.

以下是相关代码:

override func didMove(to view: SKView) {
    // screen border setup
    let border = SKPhysicsBody(edgeLoopFrom: self.frame)
    border.friction = 0
    border.allowsRotation = true
    border.friction = 0
    border.restitution = 1
    border.linearDamping = 0
    border.angularDamping = 0

    physicsBody = border
    physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    physicsWorld.contactDelegate = self

    // bottom edge setup
    let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.size.width, height: 2)
    let bottom = SKNode()
    bottom.physicsBody = SKPhysicsBody(edgeLoopFrom: rect)
    bottom.physicsBody!.categoryBitMask = BottomCategory
    addChild(bottom)

    // ball setup
    let ball = childNode(withName: "ball") as! SKSpriteNode
    ball.physicsBody?.applyImpulse(CGVector(dx: 30, dy: -30))
    ball.physicsBody?.allowsRotation = true
    ball.physicsBody?.friction = 0
    ball.physicsBody?.restitution = 1
    ball.physicsBody?.linearDamping = 0
    ball.physicsBody?.angularDamping = 0
    ball.physicsBody?.contactTestBitMask = BlockCategory | BottomCategory
    ball.physicsBody?.categoryBitMask = BallCategory

    // paddle setup
    let paddle = childNode(withName: "paddle") as! SKSpriteNode
    paddle.physicsBody!.categoryBitMask = PaddleCategory
}
4

0 回答 0