SpriteKit中无尽的滚动背景

我正在尝试使用Apple的SpriteKit进行侧面滚动游戏。 当想要做无尽的滚动背景时,我遇到了这个答案 。

在实施解决scheme之后,它似乎能够正常工作, 尽pipe它显着降低了我的FPS。 这可能是由于图像位置正在每帧重新计算。

我觉得如果我可以使用一个或多个SKAction调用来照顾这个animation,但我不确定如何实现它会好得多。

思考?

我到目前为止在我的场景类中的代码(这只是在屏幕上一次背景)

 - (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]; } 

我在上一个开源项目中做了一个名为SKScrollingNode : SprityBird 。

即使是3或4层(视差),FPS也不是问题,但您可能需要自己尝试。

要使用它,你只需要添加它像其他任何节点,并给它一个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:(NSString *)name inContainerWidth:(float) width; - (void) update:(NSTimeInterval)currentTime; @end 

SKScrollingNode.m

 @implementation SKScrollingNode + (id) scrollingNodeWithImageNamed:(NSString *)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 

我一直在为一个无限的平铺滚动库的工作,你可以很容易地使用它来创build一个滚动的背景。 看看它:

RPTileScroller

我努力使其成为最高效的,但我不是一个游戏开发者。 我用我的iPhone 5与10×10像素的随机颜色瓷砖尝试,并运行在一个固定的60 fps。