Физика дрожания / вибрации тела в состоянии покоя SpriteKit - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь имитировать поведение c, подобное поведению маракасы или погремушки.

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

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

Я пытался возиться с реституцией, массой, плотностью, гравитацией и т. Д. c в SpriteKit. Также я попытался реализовать другие способы, такие как не обновлять вид, если шарики достаточно медленные, чтобы казаться в покое.

У кого-нибудь еще были подобные проблемы с дрожанием SpriteKit и физических тел в покое?

   '''
   func addBeads () {

    let beadColors : [UIColor] = [
    .blue,
    .orange,
    .green,
    .yellow,
    .red,
    .cyan,
    .magenta
    ]


    if !IAPHelper.unlocked && interactive == false {
        return
    }

    var soundNumber = 1
    var y : CGFloat = 20
    for _ in 0...29 {
        if let color = beadColors.randomElement(), let baseImg =  
  UIImage(named: "bead")?.maskWithColor(color: color) {
            let beadSize = CGSize(width: 33, height: 33)
            let texture = SKTexture(image: baseImg)
            //let bead = SKSpriteNode(imageNamed: NodeNames.bead)
             let bead = BeadNode(texture: texture, color: .blue, size:  
  beadSize)
            bead.lightingBitMask = 0x0b0001
            bead.zPosition = Layers.bead
            bead.name = NodeNames.bead
            bead.soundNumber = soundNumber
            bead.physicsBody = SKPhysicsBody(circleOfRadius: 
  bead.size.width/2)
            bead.physicsBody?.allowsRotation = false
            bead.physicsBody?.restitution = 0.2 // 0.2 best so far
            bead.physicsBody?.isDynamic = true
            bead.physicsBody?.categoryBitMask = Masks.bead
            bead.physicsBody?.contactTestBitMask = Masks.bead | 
  Masks.wall
            bead.physicsBody?.collisionBitMask = Masks.bead | 
  Masks.wall



            bead.physicsBody?.usesPreciseCollisionDetection = true
            //  print("Inset",view?.safeAreaInsets ?? "")
            //print(bead.size)
            bead.position = CGPoint(x: size.width / 2, y: y)
            y += bead.size.height
            soundNumber += 1
            if soundNumber > 12 { soundNumber = 1 }
            //bead.position = CGPoint(x: size.width / 2, y: 500 +   
    bead.size.height - (view?.safeAreaInsets.top ?? 0))
            let resource = "bead\(soundNumber)"
            bead.soundAction = SKAction.playSoundFileNamed(resource, 
    waitForCompletion: false)

            addChild(bead)
        }
      }
   '''
...