如何使用 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】:球会不规则地弹跳,因为当你移动五边形的边时,球会碰到一点点边并改变它的轨迹。这就是重力的工作原理。
如果您想以您的方式弹球,请像这样使用SKAction
s:
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 使球仅垂直弹跳而不是水平弹跳?的主要内容,如果未能解决你的问题,请参考以下文章
如何停止 UIWebView 在 phonegap 3.0 中垂直弹跳
如何在 Swift 和 SpriteKit 中使用 UISwipeGestureRecognizer 而不是 touchesMoved?