2016-10-04 4 views
2

Я использую didBegin (контакт) вместе с битмасками, чтобы определить, с каким узлом сталкивается что-то. Я установил свою начальную скорость шара, используя applyImpulse(). Мой код для этого:Spritekit & Swift 3 - Изменение скорости шарового узла после столкновения

    let minAngle : UInt32 = 181 
        let maxAngle : UInt32 = 359 
        let randomAngle = arc4random_uniform(maxAngle - minAngle) + minAngle 
        let dx:CGFloat = 3 * cos(CGFloat(randomAngle)) 
        let dy:CGFloat = 3 * sin(CGFloat(randomAngle)) 
        ball.physicsBody?.applyImpulse(CGVector(dx: dx, dy: dy)) 

Моего didBegin (контакт) код метода:

func didBegin(_ contact: SKPhysicsContact) { 
    var firstBody = SKPhysicsBody() 
    var secondBody = SKPhysicsBody() 
    let ballNode = self.childNode(withName: ballName) 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == drainBitmask { 
     endGame() 
     Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(GameScene.showLeaderboard), userInfo: nil, repeats: false) 

    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target1Bitmask { 
     score += 20 
     self.vc.scoreLabel.text = "Score: \(score)" 



    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target2Bitmask { 
     score += 10 
     self.vc.scoreLabel.text = "Score: \(score)" 


    } else if firstBody.categoryBitMask == ballBitmask && secondBody.categoryBitMask == target3Bitmask { 
     score += 30 
     self.vc.scoreLabel.text = "Score: \(score)" 


    } 

Однако, когда мой шар сталкивается либо с целевым 1,2 или 3 скорость шарика должна быть изменена. Например, когда мяч сталкивается с мишенью 1, мне нужно, чтобы скорость шара удваивалась. Насколько я понимаю, когда вы применяете Impulse к мячу, значения dx и dy представляют собой направление и скорость, так как я могу удвоить скорость шара, сохраняя при этом реалистичный эффект отскока, возникающий при столкновении? FYI скорость, которую необходимо удвоить, - это скорость шара в момент столкновения.

EDIT - РАСШИРЕНИЕ

extension CGVector { 
var speed: CGFloat { 
    return hypot(dx, dy) 
} 

static func > (lhs: CGVector, rhs: CGVector) -> Bool { 
    return lhs.speed > rhs.speed 
} 

static func < (lhs: CGVector, rhs: CGVector) -> Bool { 
    return lhs.speed < rhs.speed 
} 

static func * (vector: CGVector, scalar: CGFloat) -> CGVector { 

    return CGVector(dx: vector.dx * scalar, dy: vector.dy * scalar) 
} 

}

Благодаря

+0

двойной скорости на теле физики – Knight0fDragon

+0

будет работать? Как объявление переменной, удерживающей текущую скорость шара во время столкновения, а затем просто умножить ее на 2? –

+0

Зачем вы его держите – Knight0fDragon

ответ

1

В SpriteKit gameloop есть много функций "udpate" стиль вы можете поместить код в.

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

Затем, в более позднем обновлении, после завершения физики - например. didSimulatePhysics(), который вызывается сразу после того, как система вычисляет всю физику, вносит необходимые изменения в скорость шара.

В didSimulatePhysics у вас могут быть флаги, которые смотрят, что было событием, которое только что произошло. В случае, если мяч попал в цель 1 цели, теперь вы можете удвоить скорость мяча, и это будет рассчитано до того, как мяч будет вынесен.

Если мяч попал цели 2, может вдвое сократить скорость и т.д.

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

  • Нет связанных вопросов^_^