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。