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

5
我正在制作一款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而不是使用重力)。

请告诉我。谢谢!


你可以使用 positionX SKConstraint 限制节点的 x 坐标。链接 - 0x141E
@0x141E 那么我该如何在我的场景中使用那个函数呢?我似乎无法正确地使用它... - Jimmy Lee
2个回答

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即可。


是的,在这里绝对不需要逼真的物理模拟。显然,这甚至可能会造成伤害。但仍然需要接触检测(使用SKActions可以很好地完成,并且这是两者结合使用的合法方式)。 - Whirlwind
我需要用这个替换掉我当前代码的哪些方面?是所有中间的“physicsBody”部分吗? - Jimmy Lee
@JimmyLee,你需要应用这个动作来让球上下移动。你必须将collisionBitMask设置为0。然后你需要定义contactTestBit mask来检测不允许的接触。就是这样。 - Whirlwind
@Whirlwind 好的,我已经这样做了,但是我仍然能够以一定角度击中它,导致它不能垂直弹跳...我能否强制它即使与另一个节点碰撞也永远不会水平移动? - Jimmy Lee
@Whirlwind 但是如果我将ball.physicsBody.collisionBitMask = 0,那么球就会穿过矩形,这不是我想要的。 - Jimmy Lee
显示剩余3条评论

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语句之前添加这些内容,它应该适用于您现有的代码。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接