2017-02-07 12 views
1

Я работаю над игрой iOS, которая потребует использования как SceneKit &. SpriteKit & задавался вопросом о функции цикла Render/update.Возможно ли иметь «update (_ currentTime: TimeInterval)» в SCNScene или SCNNode так же, как SKScene?

Я буду использовать класс SpawnController для создания различных типов объектов &, они будут основаны на временном интервале.

Прямо сейчас у меня есть GameViewController, который соответствует SCNSceneRendererDelegate как here я изменил его так, что внутри функции обновления делегат Звоню SpawnController в Пользовательская функция обновления, как так:

extension GameViewController: SCNSceneRendererDelegate { 
    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 
     mySpawnController.nextSpawn() 
    } 
} 

Я чувствую должен быть лучшим способом сделать это, например, добавить делегата в SCNScene или SCNNode.

Мой вопрос:

Можно ли иметь "обновление (_ CURRENTTIME: TimeInterval)" для SCNScene или SCNNode точно так же, как SKScene есть? Или я должен продолжать называть пользовательские дополнительные функции обновления из одной функции обновления SCNSceneRendererDelegate в моем GameViewController?

Благодаря

ответ

1

SCNView, в соответствии с SCNSceneRendererDelegate называет renderer(_: updateAtTime:) на назначенный делегатом, и это правильное место, чтобы вставить логику цикла игры.

Что касается вашего вопроса: ни SCNScene, ни SCNNode не имеет собственных методов обновления. Если вы используете как SceneKit, так и SpriteKit, достаточно (но не обязательно) иметь одно место для логики игрового цикла, как указано выше, поэтому ваш пример выглядит правильно.

Чтобы быть точным, есть разница, хотя вынести методы цикла выглядит так:

  • в SpriteKit сцены вызовы делают петлю: SKSceneDelegate «s update(_:)
  • в SceneKit вид (или другой SCNSceneRenderer) вызывает цикл рендеринга: SCNSceneRendererDelegaterenderer(_: updateAtTime:)

Wh ile в представлении SpriteKit имеет SKViewDelegateview(_:shouldRenderAtTime:), который должен возвращать true, если должен быть вызван цикл визуализации. Делегат SKScene существует только для того, чтобы избежать подкласса SKScene.

Если вы хотите более точно контролировать логику обновления, я бы рекомендовал использовать GameplayKit, который не зависит от SceneKit/SpriteKit и позволяет легко обновлять per-entity/per-component, а также повторно использовать объекты/компоненты и другие полезные свойства.

+0

Это именно то, что мне нужно [GameplayKit] (https://developer.apple.com/library/content/documentation/General/Conceptual/GameplayKit_Guide/#//apple_ref/doc/uid/TP40015172-CH1-SW1) спасибо – vikMage