Arrière-plan de défilement sans fin dans SpriteKit

J'essaie de faire un jeu de défilement latéral en utilisant SpriteKit d'Apple. Lorsque je voulais faire un fond de défilement sans fin, je suis tombé sur cette réponse .

Après la mise en œuvre de la solution, il semble que cela fonctionne, bien qu'il baisse considérablement mes FPS. Ceci est probablement dû au fait que les positions des images sont recalculées sur chaque image.

Je pense que ce serait beaucoup mieux si je pouvais utiliser un ou plusieurs appels SKAction pour prendre soin de cette animation pour moi, mais je ne suis pas certain de la façon de l'implémenter.

Pensées?

Le code que j'ai jusqu'ici dans ma class de scène (ceci ne fait qu'animer l'arrière-plan à travers l'écran)

 - (void)addBackgroundTileAtPoint:(CGPoint)point { SKSpriteNode *bg = [SKSpriteNode spriteNodeWithImageNamed:@"background"]; bg.anchorPoint = CGPointZero; bg.position = point; bg.name = @"background"; bg.zPosition = -99; [self addChild:bg]; SKAction *sequence = [SKAction sequence:@[ [SKAction moveByX:-(bg.size.width * 2) y:0 duration:10], [SKAction removeFromParent] ]]; [bg runAction: sequence]; } 

J'ai fait un petit composant appelé SKScrollingNode pour ce besoin particulier dans mon dernier projet open source: SprityBird .

FPS n'était pas un problème, même avec 3 ou 4 couches (pour la parallaxe), mais vous devrez peut-être essayer vous-même.

Pour l'utiliser, il suffit de l'append comme n'importe quel autre noeud et de lui donner un file de type scrollingSpeed :

 back = [SKScrollingNode scrollingNodeWithImageNamed:@"back" inContainerWidth:WIDTH(self)]; [back setScrollingSpeed:BACK_SCROLLING_SPEED]; [self addChild:back]; 

SKScrollingNode.h

 @interface SKScrollingNode : SKSpriteNode @property (nonatomic) CGFloat scrollingSpeed; + (id) scrollingNodeWithImageNamed:(NSSsortingng *)name inContainerWidth:(float) width; - (void) update:(NSTimeInterval)currentTime; @end 

SKScrollingNode.m

 @implementation SKScrollingNode + (id) scrollingNodeWithImageNamed:(NSSsortingng *)name inContainerWidth:(float) width { UIImage * image = [UIImage imageNamed:name]; SKScrollingNode * realNode = [SKScrollingNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(width, image.size.height)]; realNode.scrollingSpeed = 1; float total = 0; while(total<(width + image.size.width)){ SKSpriteNode * child = [SKSpriteNode spriteNodeWithImageNamed:name ]; [child setAnchorPoint:CGPointZero]; [child setPosition:CGPointMake(total, 0)]; [realNode addChild:child]; total+=child.size.width; } return realNode; } - (void) update:(NSTimeInterval)currentTime { [self.children enumerateObjectsUsingBlock:^(SKSpriteNode * child, NSUInteger idx, BOOL *stop) { child.position = CGPointMake(child.position.x-self.scrollingSpeed, child.position.y); if (child.position.x <= -child.size.width){ float delta = child.position.x+child.size.width; child.position = CGPointMake(child.size.width*(self.children.count-1)+delta, child.position.y); } }]; } @end 

J'ai travaillé sur une bibliothèque pour un défilement de tuiles infini, vous pouvez facilement l'utiliser pour créer un arrière-plan de défilement. Jetez un coup d'oeil:

RPTileScroller

J'ai fait un effort pour le rendre le plus efficace possible, mais je ne suis pas un développeur de jeux. Je l'ai essayé avec mon iPhone 5 avec des carreaux de colors randoms de 10×10 pixels, et fonctionne sur un solide 60 fps.