如何使用SKSpriteKit使球仅垂直弹跳而不是水平弹跳?

时间:2016-08-14 05:01:53

标签: ios swift xcode sprite-kit game-physics

我正在制作一个iOS应用程序,其中我只想让球反弹并且向下,不是水平或任何其他角度。不幸的是,我决定设计游戏的方式导致了一些问题。这是一个GIF,它显示了我的问题:

enter image description here

基本上:有时当我点击旋转五角大楼时,它会以一定角度撞击球,而我只想让它上下移动。

这是我的球代码:

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

    ball.physicsBody = SKPhysicsBody(circleOfRadius: 25)
    ball.physicsBody?.affectedByGravity = true
    ball.physicsBody?.restitution = 0.99
    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

    return ball
}

无论如何,我可以将球设计为始终以某一直线(垂直方向)移动吗?有没有人对球有设计建议,或者有不同的移动方式(SKActions,例如:moveTo而不是使用重力)。

让我知道。谢谢!

2 个答案:

答案 0 :(得分:2)

球不规则地弹跳,因为当你移动五边形的两侧时,球会触及一点点的侧面并改变其轨迹。这就是重力的作用。

如果你想以你自己的方式反弹球,请使用SKAction这样:

    let up = SKAction.moveBy(CGVector(dx: 0, dy: 40), duration: 0.3)
    let down = SKAction.moveBy(CGVector(dx: 0, dy: -40), duration: 0.3)
    let upAndDown = SKAction.sequence([up, down])
    let foreverUpDown = SKAction.repeatActionForever(upAndDown)

只需在球上拨打runAction

答案 1 :(得分:2)

要将节点的x坐标限制为固定值,请定义SKRange,并将最小和最大参数设置为相同的值。

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

在范围内,定义positionX约束

let constraint = SKConstraint.positionX(range)

最后,将约束添加到节点的constraints数组

ball.constraints = [constraint]

如果您将现有代码添加到return ball语句上方,则应该可以使用此代码。