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

Posted

技术标签:

【中文标题】如何使用 SpriteKit 使球仅垂直弹跳而不是水平弹跳?【英文标题】:How to make ball bounce vertically only and not horizontally using SKSpriteKit? 【发布时间】: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 那么我将如何在我的场景中使用该功能?我似乎无法做到这一点...... 【参考方案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 好的,我这样做了,但是我仍然能够以一定角度击中它并导致它不会垂直反弹...我可以强制它永远不会水平移动,即使与另一个碰撞节点?

以上是关于如何使用 SpriteKit 使球仅垂直弹跳而不是水平弹跳?的主要内容,如果未能解决你的问题,请参考以下文章

在 SpriteKit 中为弹跳球创建音效

滚动时禁用 UITableView 垂直反弹

如何停止 UIWebView 在 phonegap 3.0 中垂直弹跳

如何在 Swift 和 SpriteKit 中使用 UISwipeGestureRecognizer 而不是 touchesMoved?

如何仅使用 CSS 和 HTML 约束动画?

Physics Body 边缘 IOS8,Sprite Kit