2017-02-07 7 views
1

Je travaille sur un jeu iOS qui nécessitera l'utilisation des deux SceneKit & SpriteKit & se posait des questions sur la fonction de rendu/mise à jour de la boucle.Est-il possible d'avoir "update (_ currentTime: TimeInterval)" dans SCNScene ou SCNNode de la même manière que SKScene?

Je vais utiliser une classe SpawnController pour engendrer différents types d'objets & ils seront basés sur l'intervalle de temps.

En ce moment, j'ai un GameViewController conforme à la SCNSceneRendererDelegate comme here je l'ai modifié pour que l'intérieur de la fonction de mise à jour du délégué que j'appelle ma fonction de mise à jour personnalisée de SpawnController comme ceci:

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

Je sens qu'il doit être une meilleure façon de le faire, comme ajouter un délégué à un SCNScene ou un SCNNode.

Ma question:

Est-il possible d'avoir "mise à jour (_ currentTime: TimeInterval)" pour SCNScene ou SCNNode la même manière que SKScene a? Ou devrais-je continuer à appeler des fonctions de mise à jour personnalisées à partir de la fonction de mise à jour de SCNSceneRendererDelegate dans mon GameViewController?

Merci

Répondre

1

Le SCNView, conforme à SCNSceneRendererDelegate appelle renderer(_: updateAtTime:) le délégué désigné, et il est bon endroit pour insérer la logique de boucle de jeu.

Concernant votre question: ni SCNScene ni SCNNode a ses propres méthodes de mise à jour. Si vous utilisez à la fois SceneKit et SpriteKit, il est suffisant (mais pas nécessaire) d'avoir une place pour la logique de boucle de jeu, comme mentionné ci-dessus, donc votre exemple semble correct.

Pour être précis, il y a une différence, bien que rendre les méthodes de boucle se ressemble:

  • dans SpriteKit scène appels render boucle: SKSceneDelegate « s update(_:)
  • dans SceneKit vue (ou autre SCNSceneRenderer) appelle la boucle de rendu: SCNSceneRendererDelegaterenderer(_: updateAtTime:)

Wh ile dans la vue SpriteKit a SKViewDelegateview(_:shouldRenderAtTime:) qui doit retourner true si la boucle de rendu doit être appelée. Le délégué SKScene n'existe que pour éviter la sous-classe SKScene. Si vous cherchez un contrôle plus précis de la logique de mise à jour, je vous recommande d'utiliser GameplayKit qui est indépendant de SceneKit/SpriteKit et permet facilement des mises à jour per-entity/per-component ainsi que la réutilisation d'entités/composants et autres goodies.

+0

C'est exactement ce que je avais besoin [GameplayKit] (https://developer.apple.com/library/content/documentation/General/Conceptual/GameplayKit_Guide/#//apple_ref/doc/uid/TP40015172-CH1-SW1) Je vous remercie – vikMage