Ios 如何使用SKSpriteKit使球仅垂直反弹而不水平反弹?
我正在制作一个iOS应用程序,其中我只希望球上下弹跳,而不是水平或任何其他角度。不幸的是,我决定设计游戏的方式导致了一些问题。下面是一个GIF,它显示了我的问题所在: 基本上:有时当我点击旋转五角大楼时,当我只想让球上下移动时,它会以一定角度击中球 以下是我的球代码:Ios 如何使用SKSpriteKit使球仅垂直反弹而不水平反弹?,ios,swift,xcode,sprite-kit,game-physics,Ios,Swift,Xcode,Sprite Kit,Game Physics,我正在制作一个iOS应用程序,其中我只希望球上下弹跳,而不是水平或任何其他角度。不幸的是,我决定设计游戏的方式导致了一些问题。下面是一个GIF,它显示了我的问题所在: 基本上:有时当我点击旋转五角大楼时,当我只想让球上下移动时,它会以一定角度击中球 以下是我的球代码: func createBallNode(ballColor: String) -> SKSpriteNode { let ball = SKSpriteNode(imageNamed: ballColor)
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而不是使用重力)
让我知道。谢谢 球会不规则地反弹,因为当你移动五角大楼的侧面时,球会碰到一点点侧面并改变其轨迹。重力就是这样工作的 如果您想按自己的方式弹起球,请按如下方式使用
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
。要将节点的x坐标限制为固定值,请定义一个SKRange
,并将最小和最大参数设置为相同的值
let centerX = ball.position.x
let range = SKRange(lowerLimit:centerX, upperLimit:centerX)
从范围中,定义一个positionX
约束
let constraint = SKConstraint.positionX(range)
最后,将约束添加到节点的约束
数组中
ball.constraints = [constraint]
如果将现有代码添加到
返回球
语句上方,则该操作应适用于现有代码。可以使用位置x
SKConstraint
限制节点的x坐标@0x141E那么我将如何在我的场景中使用该函数呢?我似乎无法正确理解……是的,这里绝对不需要真实的物理模拟。很明显,它甚至会痛。但是仍然需要接触检测(这与SKActions配合使用很好,并且是将两者结合使用的合法方式)。我当前代码的哪些方面需要用它来替换?所有中间的“physicsBody”动作?@JimmyLee你需要运用这个动作来上下移动球。必须将collisionBitMask设置为0。然后必须定义contactTestBit掩码来检测不允许的联系人。就这样。你还必须使球不受重力的影响。不需要真实的物理模拟。您只想使用接触检测部件。@Whirlwind好的,我这样做了,但我仍然能够以一定角度击中它,使它不会垂直反弹。。。我可以强制它即使在与另一个节点发生碰撞时也不水平移动吗?