2016-07-07 2 views
2

У меня есть сценарий, где у меня есть фиксированное обновление, происходящее на моей сцене.Sprite Kit Physics: можно использовать фиксированное обновление?

Каждое обновление, я хотел бы создать тень, используя предыдущую позицию спрайтов.

func update(currentTime: NSTimeInterval) 
{ 
    shadow.position = sprite.position 
} 

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

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

E.G. Потребовался мой телефон 1 секунда, чтобы переместить спрайт на 60 шагов. взял мой симулятор. 2 секунды, чтобы переместить спрайт. 60 шагов.

.

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

Фактические результаты, однако поставит тренажер на 120 шагов

Я попытался отключить asynchronous на SKView в надежде, что бы получить меня фиксированные обновления, но это не заставило меня нигде, поэтому я прошу, если кто-нибудь знает как заставить SKPhysics работать с фиксированной базой обновлений.

+0

Рассчитайте разницу во времени между обновлениями с помощью 'currentTime' аргумента, масштаб движения этой разностью – Kametrixom

+1

Это не хороший подход, Вы удваивая усилия машины уже запаздывает – Knight0fDragon

+1

Почему не ограничивают тень к спрайту? –

ответ

1

Я не уверен, если это может быть полезно для вас, я уверен, что вы знаете, этот параметр, но, возможно, вы не заметили:

if let scene = GameScene(fileNamed:"GameScene") { 
      // Configure the view. 
      let skView = self.view as! SKView 
      skView.showsFPS = true 
      skView.showsPhysics = true 
      skView.showsNodeCount = true 

      skView.frameInterval = 1 // real devices 
      #if (arch(i386) || arch(x86_64)) && os(iOS) 
       skView.frameInterval = 2 // <- this one 
      #endif 

      /* Sprite Kit applies additional optimizations to improve rendering performance */ 
      skView.ignoresSiblingOrder = true 
      /* Set the scale mode to scale to fit the window */ 
      scene.scaleMode = .ResizeFill 
      skView.presentScene(scene) 
     } 

Источники:

/* Number of hardware vsyncs between callbacks, same behaviour as CADisplayLink. Defaults to 1 (render every vsync) */ 
     public var frameInterval: Int 

Документы:

Это официальный Apple, document что са y:

Значение по умолчанию равно 1, что приводит к тому, что ваша игра будет уведомлена о частоте обновления дисплея. Если для значения установлено значение больше , чем 1, отображаемая ссылка уведомляет вашу игру на долю базовой частоты обновления . Например, установка интервала в 2 приводит к тому, что сцену вызывается каждый другой кадр, обеспечивая половину частоты кадров.

Установка этого значения менее 1 приводит к неопределенному поведению и является ошибкой программиста.

+0

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

+0

Единственное, что я думаю, это источники Cocos2D (подробно CCScheduler.m), где вы можете найти подробности о методе обновления cocos2d, и все исправления применимы к этому здесь: https://github.com/Maxim-Filimonov/conways_gol_ios/blob/master/ConwaysGOL.spritebuilder/Source/libs/cocos2d-iphone/cocos2d/CCScheduler.m –

+0

Cocoas2d не комплект спрайтов, я не пользуюсь кокосами 2d, вопрос не о кокосах 2d. Цель состоит в том, чтобы заставить SKPhysics работать с фиксированным обновлением. (Технически, если я смогу обновить Sprite Kit, чтобы работать по-настоящему согласованно, где dTime - 16.6666, тогда это будет золотым) – Knight0fDragon