Я пытаюсь имитировать поведение 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)
}
}
'''