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)
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.