Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用SKSpriteKit使球仅垂直反弹而不水平反弹?_Ios_Swift_Xcode_Sprite Kit_Game Physics - Fatal编程技术网

Ios 如何使用SKSpriteKit使球仅垂直反弹而不水平反弹?

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)

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


让我知道。谢谢

球会不规则地反弹,因为当你移动五角大楼的侧面时,球会碰到一点点侧面并改变其轨迹。重力就是这样工作的

如果您想按自己的方式弹起球,请按如下方式使用
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好的,我这样做了,但我仍然能够以一定角度击中它,使它不会垂直反弹。。。我可以强制它即使在与另一个节点发生碰撞时也不水平移动吗?