Sprite kit défilement latéral

J'ai commencé à travailler avec le kit Sprite et je me demandais comment créer un jeu de défilement latéral infini? J'ai lu la documentation du kit Sprite et j'ai lu le pré-traitement de la scène. Il est indiqué que nous pouvons réajuster la position de la scène dans le cas où le contenu est plus grand que la scène. Je l'ai essayé et cela fonctionne cependant, quand je fais défiler toute l'image d'arrière-plan, je commence à voir l'arrière-plan par défaut de la scène. Comment puis-je créer l'arrière-plan infini? Quelqu'un peut-il me diriger vers la bonne documentation ou les articles qui parlent de son problème? Je vous remercie.

Quelque chose comme ça devrait vous aider à démarrer:

Ajouter les images d'arrière-plan …

for (int i = 0; i < 2; i++) { SKSpriteNode * bg = [SKSpriteNode spriteNodeWithImageNamed:@"background"]; bg.anchorPoint = CGPointZero; bg.position = CGPointMake(i * bg.size.width, 0); bg.name = @"background"; [self addChild:bg]; } 

Dans votre méthode de mise à jour.

 [self enumerateChildNodesWithName:@"background" usingBlock: ^(SKNode *node, BOOL *stop) { SKSpriteNode *bg = (SKSpriteNode *) node; bg.position = CGPointMake(bg.position.x - 5, bg.position.y); if (bg.position.x <= -bg.size.width) { bg.position = CGPointMake(bg.position.x + bg.size.width * 2, bg.position.y); } }]; 

C'est d'un exemple dans RW son exemple utilisé taille de l'image de fond de 1136 px.

J'ai fait un composant générique appelé SKScrollingNode à cette fin car j'ajoute généralement plusieurs arrière-plans de défilement pour get un effet de parallaxe. L'utiliser est assez simple:

Déclarez-le dans votre class de scène

 @property(strong,nonatomic) SKScrollingNode * clouds; 

Créez-le et ajoutez-le à l'instance de scène

 self.clouds = [SKScrollingNode spriteNodeWithImageNamed:@"clouds"]; self.clouds.scrollingSpeed = .5; // Speed at which the clouds will scroll [self addChild:clouds]; 

Et dans votre méthode de mise à jour de la scène, appelez simplement

 [self.clouds update:currentTime] 

Terminé !

Vous pouvez find le code complet du composant 'SKScrollinNode' ici:

https://github.com/kirualex/SprityBird/blob/master/spritybird/Classes/Scenes/

Mon exemple de code pour cette reference exacte en utilisant SpriteKit et Swift est vu ci-dessous.

 func background1() { let backgroundTexture = SKTexture(imageNamed: "bg") //move background right to left; replace let shiftBackground = SKAction.moveByX(-backgroundTexture.size().width, y: 0, duration: 15) let replaceBackground = SKAction.moveByX(backgroundTexture.size().width, y:0, duration: 0) let movingAndReplacingBackground = SKAction.repeatActionForever(SKAction.sequence([shiftBackground,replaceBackground])) for var i:CGFloat = 0; i<3; i++ { //defining background; giving it height and moving width let background = SKSpriteNode(texture:backgroundTexture) background.position = CGPoint(x: backgroundTexture.size().width/2 + (backgroundTexture.size().width * i), y: CGRectGetMidY(self.frame)) background.size.height = self.frame.height background.zPosition = -20 background.runAction(movingAndReplacingBackground) self.addChild(background) 
  1. Crée un backgroundTexture constant créé comme SKTexture avec votre image.
  2. créez des constantes pour déplacer votre arrière-plan vers la gauche (shiftBackground) et pour append une autre instance de votre arrière-plan sur le côté droit de votre écran actuellement affiché (replaceBackground)
  3. créez une constante (movingAndReplacingBackground) en tant que SKAction qui se répète à l'infini, en définissant le paramètre de la fonction repeatActionForever sur une séquence SKAction avec vos constantes shiftBackground et replaceBackground référencées.
  4. créer une boucle qui définit les définitions de votre arrière-plan. (pour la variable i, si la quantité de i est inférieure à 3, incrémenter i par un.
  5. Dans la boucle, défendez la texture, la position, la taille et la zPosition (si l'ordre des frères et sœurs est désactivé), puis appelez votre moveAndReplacingBackground comme action, puis répétez votre séquence.
  6. enfin, la dernière partie de la boucle ajoute votre arrière-plan. Il effectuera cette action chaque fois qu'il y aura less de 3 itérations. et dès que votre premier fond atteint l'extrême gauche de l'écran, les noeuds seront supprimés à 2, ce qui entraînera une nouvelle exécution de l'action dans la boucle.

J'ai enveloppé ceci dans une fonction car pour un fond de parallaxe, j'ai pu copyr cette fonction 4 fois, renommer les variables, changer la "durée" pour la constante shiftBackground, et get des vitesses différentes en fonction de leur distance.

J'espère que ça aide! Lorsque Swift passera à Swift 3, cette boucle "C-Style" sera déconseillée, donc je ne suis pas sûr de savoir comment résoudre ce problème à long terme.

J'ai travaillé sur une bibliothèque pour un défilement de tuiles infini, avec un peu de chance, pourrait être le sharepoint départ pour un défilement latéral:

RPTileScroller

Il utilise un délégué semblable à tableView, donc j'espère qu'il est vraiment facile de fournir des tuiles, ou n'importe quel type de nœud, au scroller. Je n'ai pas encore de logique de collision implémentée, mais je prévois d'append cela aussi.