2016-08-24 2 views
0

Я пытаюсь сделать свое первое приложение для iOS и в настоящее время сталкивается с проблемой.SKSpriteKit, поддерживающий постоянную скорость после столкновения

В моей игре, когда мяч отскакивает, я хочу, чтобы он оправился на ту же высоту и с той же скоростью. В настоящее время это все прекрасно. Однако, когда я поворачиваю шестиугольник, и он попадает под углом, он заканчивает проигрыш скорости, а не подпрыгивает до той же высоты.

Так что мой вопрос: как заставить мяч поддерживать ту же скорость при столкновении?

Вот код для моего шарика узла:

func createBallNode(ballColor: String) -> SKSpriteNode { 
    let ball = SKSpriteNode(imageNamed: ballColor) 
    ball.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)+30) 
    ball.zPosition = 1 

    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2) 
    ball.physicsBody?.affectedByGravity = true 
    ball.physicsBody?.restitution = 1 
    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 

    let centerX = ball.position.x 
    let range = SKRange(lowerLimit: centerX, upperLimit: centerX) 

    let constraint = SKConstraint.positionX(range) 
    ball.constraints = [constraint] 

    return ball 
} 

Ниже GIF объяснения проблемы в визуальной форме: enter image description here

ответ

1

Вопрос заключается в том, что если шар сталкивается под углом, его полная скорость разделяется между вертикальной и горизонтальной составляющими нового вектора скорости. Поскольку вы ограничили движение горизонтального положения шара, горизонтальная скорость теряется, и мяч не отскакивает столь же высоко.

Одно из возможных решений заключается в том, чтобы переопределить didSimulatePhysics в вашей сцене и проверить, недостаточно ли скорости шара, чтобы достичь желаемой высоты. Если это не так, увеличьте ее скорость так, как будет.

let neededVelocity = sqrt(2 * physicsWorld.gravity.dy * (intendedHeight - ball.posiiton.y)) 
if ball.physicsBody.velocity.dy < neededVelocity && ball.physicsBody.velocity.dy > 0 { 
    ball.physicsBody.velocity = CGVector(dx: 0, dy: neededVelocity) 
} 
+0

Какое значение будет «intentedHeight»? Так что, если высота должна быть в середине экрана, что я ему даю? –

+0

@JimmyLee Это может быть только центр шестиугольника. Если это также центр сцены, вы можете использовать 'let purposeHeight = view.frame.midY'. – nathan

+0

К сожалению, это не помогло мне исправить мою проблему: / –

Смежные вопросы