我正在尝试使用Apple的SpriteKit进行侧滚动游戏。当想要制作无休止的滚动背景时,我遇到了这个answer。
在实施解决方案之后,它看起来似乎工作虽然它会显着降低我的FPS。这可能是因为每帧都重新计算了图像位置。
我觉得如果我可以使用一个或多个SKAction
调用来处理这个动画会更好,但我不确定如何实现它。
思想?
到目前为止我在我的场景类中的代码(虽然这只是在屏幕上显示背景的一次)
- (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];
}
答案 0 :(得分:12)
我在上一个开源项目中针对特定需求做了一个名为SKScrollingNode
的小组件:SprityBird。
即使有3层或4层(视差),FPS也不是问题,但您可能需要亲自尝试。
要使用它,您只需像任何其他节点一样添加它并给它一个scrollingSpeed
likeo:
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
答案 1 :(得分:1)
我一直在为无限平铺滚动条的库工作,您可以轻松地使用它来创建滚动背景。看看它:
我努力使其成为最有效的,但我不是游戏开发者。我用我的iPhone 5和10x10像素的随机颜色瓷砖试用了它,并且运行稳定的60 fps。