SKPhysicsJointИсправлено в SpriteKit и Swift

Я делаю игру в Sprite Kit и Swift, и у меня есть Sprite внизу экрана и падающие Sprites сверху, которые я хочу поймать и приклеить к Sprite внизу, поэтому я пытаюсь использовать SKPhysicsJointFixed но когда объекты сталкиваются вместо того, чтобы падающий объект прилипал к тому, что внизу, который должен поймать и прикрепиться, кажется, что нижний спрайт адаптирует физику падающего спрайта, а затем падает с экрана вместе с ним. Вот код, который у меня есть в моем методе didBeginContact. а вертел это имя спрайта внизу который всегда должен быть внизу и не исчезать.

    if contact.bodyA.node!.name == "Skewer"
    {
        let boundX = skewer.physicsBody?.node?.position.x
        let fixedJoint = SKPhysicsJointFixed.jointWithBodyA(contact.bodyA.node!.physicsBody, bodyB: contact.bodyB.node!.physicsBody, anchor: CGPoint(x: boundX!, y: boundY))
        physicsWorld.addJoint(fixedJoint)

        //            contact.bodyB.node!.removeFromParent()
    }
    else
    {
        contact.bodyA!.node!.removeFromParent()
    }

и физика для нижнего экрана Sprite здесь

func makeSkewer()

{
    skewer.name = "Skewer"

    skewer.position = CGPoint(x: size.width * 0.5, y: size.height * 0.244)

    skewer.physicsBody = SKPhysicsBody(rectangleOfSize: skewer.size)
    skewer.physicsBody?.affectedByGravity = false
    skewer.physicsBody?.categoryBitMask = kSkewerCategory
    skewer.physicsBody?.contactTestBitMask = kFoodCategory
    skewer.physicsBody?.collisionBitMask = kSceneEdgeCategory

    addChild(skewer)
}

и физика для падающих спрайтов тут

func random() ->CGFloat
{
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}

func random(#min: CGFloat,max: CGFloat) -> CGFloat
{
    return random() * (max - min) + min
}

func addFood()
{
    let randomCatchIndex = Int(arc4random_uniform(UInt32(foods.count)))
    let food = SKSpriteNode(imageNamed: foods[randomCatchIndex])
    let actualX = random(min: food.size.width/2, max: size.width - food.size.width/2)
    let actualDuration = random(min: CGFloat(1.5), max: CGFloat(8.0))
    let actionMove = SKAction.moveTo(CGPoint(x: actualX, y: -food.size.height/2), duration: NSTimeInterval(actualDuration))
    let actionMoveDone = SKAction.removeFromParent()


    food.physicsBody = SKPhysicsBody(rectangleOfSize: food.size)
    food.position = CGPoint(x: actualX, y: size.height + food.size.height/2)

    food.physicsBody?.categoryBitMask = kFoodCategory
    food.physicsBody?.contactTestBitMask = kSkewerCategory
    food.physicsBody?.collisionBitMask = 0x0
    food.physicsBody?.dynamic = true
    food.runAction(SKAction.sequence([actionMove, actionMoveDone]))

    addChild(food)

}

person Ian Kunneke    schedule 19.08.2015    source источник
comment
Вы также должны показать, как вы устанавливаете физические тела для рассматриваемых спрайтов.   -  person neo    schedule 19.08.2015
comment
хорошо, спасибо, я добавлю это   -  person Ian Kunneke    schedule 19.08.2015


Ответы (1)


Установите шампур, чтобы он не имел динамической физики. То, что у вас есть сейчас, это то, что на него не действует гравитация, и как только он фиксируется на еде (которая движется вниз и имеет импульс), вертел движется вместе с ним.

При создании шампура выполните следующую строку:

skewer.physicsBody?.dynamic = false

Теперь вы также можете игнорировать affectedByGravity, так как это влияет только на динамические объекты.

person Gliderman    schedule 19.08.2015