SpriteKit中无尽的滚动背景

Kyl*_*cot 8 cocoa-touch objective-c ios sprite-kit

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

在实施解决方案后,它似乎确实有效,尽管它显着降低了我的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];
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*lex 12

我在上一个SKScrollingNode开源项目中做了一个小组件,需要特殊需求:SprityBird.

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

要使用它,您只需像任何其他节点一样添加它并给它一个scrollingSpeedlikeo:

back = [SKScrollingNode scrollingNodeWithImageNamed:@"back" inContainerWidth:WIDTH(self)];
[back setScrollingSpeed:BACK_SCROLLING_SPEED];
[self addChild:back];
Run Code Online (Sandbox Code Playgroud)

SKScrollingNode.h

@interface SKScrollingNode : SKSpriteNode

@property (nonatomic) CGFloat scrollingSpeed;

+ (id) scrollingNodeWithImageNamed:(NSString *)name inContainerWidth:(float) width;
- (void) update:(NSTimeInterval)currentTime;

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)