SKPhysicsJointFixed в SpriteKit и Swift
Я делаю игру в Sprite Kit и Swift, и у меня есть Sprite внизу экрана и падаю спрайты сверху, которых я хочу поймать и придерживаться 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)
}
1 ответ
Установите вертел, чтобы не иметь динамическую физику. То, что у вас есть в настоящее время, это то, что на него не влияет гравитация, и как только он фиксируется на еде (которая движется вниз и имеет импульс), шампур движется вместе с ней.
При создании шампура запустите следующую строку:
skewer.physicsBody?.dynamic = false
Вы также можете теперь игнорировать affectedByGravity
поскольку это то, что влияет только на динамические объекты.