Контактная физика Gap в SpriteKit (Swift)

Я работаю над своим первым проектом быстрого набора спрайтов для iOS, но столкнулся с проблемой, которую просто не могу найти решение. Моя цель - посадить мяч на движущейся платформе, и мяч и платформа остановятся при контакте.

Проблема, с которой я сталкиваюсь, заключается в том, что между платформой и мячом постоянно возникает зазор, когда код распознает их контакт и заставляет их остановиться. Смотрите прикрепленное фото:

Изображение здесь

Мяч:

//Ball Node
func createPlayer() -> SKNode {
    let playerNode = SKNode()
    playerNode.position = CGPoint(x: self.size.width / 2, y: self.size.height * 0.25)

    let sprite = SKSpriteNode(imageNamed: "ball")
    sprite.setScale(scaleFactor)

    playerNode.addChild(sprite)   
    playerNode.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width / 2)
    playerNode.physicsBody?.dynamic = false
    playerNode.physicsBody?.allowsRotation = false
    playerNode.physicsBody?.restitution = 0.0
    playerNode.physicsBody?.friction = 0.0
    playerNode.physicsBody?.angularDamping = 0.0
    playerNode.physicsBody?.linearDamping = 0.0
    playerNode.physicsBody?.usesPreciseCollisionDetection = true
    playerNode.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Player
    playerNode.physicsBody?.collisionBitMask = 0
    playerNode.physicsBody?.contactTestBitMask = CollisionCategoryBitmask.Platform | CollisionCategoryBitmask.Vortex

    return playerNode

Платформа:

//Platform
sprite = SKSpriteNode(imageNamed: "platform")
let node = PlatformNode()
let thePosition = CGPoint(x: position.x * scaleFactor - (sprite.size.width / 1.999), y: position.y + (self.size.height * 0.50))
 sprite.setScale(scaleFactor)
 node.addChild(sprite)
node.physicsBody?.usesPreciseCollisionDetection = true
node.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
node.physicsBody?.dynamic = false
node.physicsBody?.categoryBitMask = CollisionCategoryBitmask.Platform
node.physicsBody?.collisionBitMask = 0
return node

didBeginContact:

func didBeginContact(contact: SKPhysicsContact) {
    var updateHUD = true
    maxPlayerY = Int(player.position.y)
    let whichNode = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node
    //If the ball is falling
    if player.physicsBody?.velocity.dy < 0 {
        let other = whichNode as! GameObjectNode

        //If the player hits the Platform
        if player.physicsBody?.velocity.dy < 0 && whichNode?.name == "NODE_PLATFORM" {

            let joint = SKPhysicsJointFixed.jointWithBodyA(player.physicsBody, bodyB:whichNode!.physicsBody, anchor:CGPoint(x: player.position.x, y: ballBottom))
            let moveScreen = SKAction.moveToY(-(player.position.y - 200), duration: 0.5)
            let moveVortex = SKAction.moveToY((player.position.y - scaleFactor*300), duration: 0.5)

                physicsWorld.addJoint(joint
                player.physicsBody?.velocity = CGVector(dx: player.physicsBody!.velocity.dx, dy: 0)
                player.physicsBody?.affectedByGravity = false
                } 
            } 
    }

1 ответ

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

Другие вопросы по тегам