SpriteKit дает разные результаты как для разных запусков, так и для разных узлов при следовании по пути

#swift #macos #sprite-kit #skshapenode

Вопрос:

macOS 11.15.2

Используя SpriteKit, я установил десять кругов подряд. Я использую a CGMutablePath , чтобы пару раз зациклить их. Каждый круг получает точно такой же путь, с точки зрения геометрии.

Есть несколько вероятных вещей, которые я здесь вижу. Один из них заключается в том, что при любом заданном пробеге не все круги в конечном итоге выстроятся в линию, и, как таковые, они на самом деле не должны были следовать по одному и тому же пути. Кроме того, при пробежке, результаты разные. На некоторых пробегах круги выглядят почти правильно выстроенными, а на других пробегах они дико расходятся.

Наконец, если вы установите смещение между кругами 0 равным (полностью перекрывая их), круги в конечном итоге пойдут по одному и тому же пути во время одного прогона (хотя трудно сказать, пройден ли прогон).

Гравитация не включена.

Мне нужны детерминированные результаты.

Вот соответствующий код, который генерирует путь и добавляет круги к игровой сцене:

     private func loopAction(from:CGPoint, duration:TimeInterval, centripetalRadius: CGFloat) -> SKAction{
        
        let path = CGMutablePath()
        path.move(to:  from)
        
        path.addArc(center: CGPoint(x: CGFloat(from.x), y: from.y), radius: centripetalRadius, startAngle: CGFloat(2*Double.pi), endAngle: CGFloat(2*Double.pi - 30), clockwise: true)
        
        let action = SKAction.follow(path, asOffset: false, orientToPath: false, duration: duration)
        return action
    }


func wave(){
   
    var circle:SKShapeNode
    let radius:CGFloat = 20;
    let centripetalRadius:CGFloat = 60;
    let screenCenter = CGPoint(x:gameScene.frame.maxX/2, y:gameScene.frame.maxY/2)
    let xOffset = 40;
    for n in 0...9{
        
        circle = SKShapeNode(circleOfRadius:radius)
        circle.run(
                loopAction(from: CGPoint(x: screenCenter.x   CGFloat(n*xOffset),y: screenCenter.y), duration: 2, centripetalRadius: centripetalRadius))
        gameScene.addChild(circle)
    }

}
 

Вот несколько скриншотов, чтобы показать, что я имею в виду (3 разных прогона):

В общем, выстроились

Далеко

Выключен, но в меньшей степени

Комментарии:

1. …Я вижу, что если я изменю его так, чтобы я буквально использовал один и тот же экземпляр SKAction для циклического перемещения по кругу, то это действительно работает. …но разве это не должно привести к тому же самому пути?