【问题标题】:How to make ball bounce vertically only and not horizontally using SKSpriteKit?如何使用 SpriteKit 使球仅垂直弹跳而不是水平弹跳?
【发布时间】:2016-08-14 05:01:52
【问题描述】:

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

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

这是我的球代码:

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 坐标。 Link
  • @0x141E 那么我将如何在我的场景中使用该功能?我似乎无法做到这一点......

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


【解决方案1】:

要将节点的 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 语句上方,这应该适用于您现有的代码。

【讨论】:

    【解决方案2】:

    球会不规则地弹跳,因为当你移动五边形的边时,球会碰到一点点边并改变它的轨迹。这就是重力的工作原理。

    如果您想以您的方式弹球,请像这样使用SKActions:

        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 配合得很好,并且是结合使用这两者的合法方式)。
    • 我需要用这个替换当前代码的哪些方面?所有中间的“physicsBody”东西?
    • @JimmyLee 您需要应用此操作来上下移动球。您必须将collisionBitMask 设置为0。然后您必须定义contactTestBit 掩码来检测不允许的接触。就是这样。
    • 另外你必须让球不受重力影响。无需逼真的物理模拟。您只想使用接触检测部分。
    • @Whirlwind 好的,我这样做了,但是我仍然能够以一定角度击中它并导致它不会垂直反弹...我可以强制它永远不会水平移动,即使与另一个碰撞节点?
    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 2013-05-26
    • 2013-05-23
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多