Scrolling background - Sprite Kit

前端 未结 3 1307
再見小時候
再見小時候 2020-12-23 18:28

So I tried to create an infinite scrolling background by using this post\'s solution (Sprite kit side scrolling). However, I would want to make the image repeatable. As you

相关标签:
3条回答
  • 2020-12-23 18:45

    Anyway, I fixed it. Just in case someone else will need it, this is how I did it:

        // Create 2 background sprites
        bg1 = [SKSpriteNode spriteNodeWithImageNamed:@"bg1"];
        bg1.anchorPoint = CGPointZero;
        bg1.position = CGPointMake(0, 0);
        [self addChild:bg1];
    
        bg2 = [SKSpriteNode spriteNodeWithImageNamed:@"bg2"];
        bg2.anchorPoint = CGPointZero;
        bg2.position = CGPointMake(bg1.size.width-1, 0);
        [self addChild:bg2];
    

    then in the update method:

        bg1.position = CGPointMake(bg1.position.x-4, bg1.position.y);
        bg2.position = CGPointMake(bg2.position.x-4, bg2.position.y);
    
        if (bg1.position.x < -bg1.size.width)
            bg1.position = CGPointMake(bg2.position.x + bg2.size.width, bg1.position.y);
    
        if (bg2.position.x < -bg2.size.width) 
            bg2.position = CGPointMake(bg1.position.x + bg1.size.width, bg2.position.y);
    
    0 讨论(0)
  • 2020-12-23 18:47

    Using Sebyffffd's answer, I've slightly modified the code to display a stack of multiple background images. (7 background images to be exact). And added a little more code for those that are struggling.

    in MyScene.h:

    @interface MyScene : SKScene
    {
    SKSpriteNode *bg1;
    SKSpriteNode *bg2;
    SKSpriteNode *bg3;
    SKSpriteNode *bg4;
    SKSpriteNode *bg5;
    SKSpriteNode *bg6;
    SKSpriteNode *bg7;
    }
    

    in MyScene.m:

    -(id)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
    // create 7 background sprites
        bg1 = [SKSpriteNode spriteNodeWithImageNamed:@"background1"];
        bg1.anchorPoint = CGPointZero;
        bg1.position = CGPointMake(0, 0);
        [self addChild:bg1];
    
        bg2 = [SKSpriteNode spriteNodeWithImageNamed:@"background2"];
        bg2.anchorPoint = CGPointZero;
        bg2.position = CGPointMake(bg1.size.width-1, 0);
        [self addChild:bg2];
    
        bg3 = [SKSpriteNode spriteNodeWithImageNamed:@"background3"];
        bg3.anchorPoint = CGPointZero;
        bg3.position = CGPointMake(bg2.size.width-1, 0);
        [self addChild:bg3];
    
        bg4 = [SKSpriteNode spriteNodeWithImageNamed:@"background4"];
        bg4.anchorPoint = CGPointZero;
        bg4.position = CGPointMake(bg3.size.width-1, 0);
        [self addChild:bg4];
    
        bg5 = [SKSpriteNode spriteNodeWithImageNamed:@"background5"];
        bg5.anchorPoint = CGPointZero;
        bg5.position = CGPointMake(bg4.size.width-1, 0);
        [self addChild:bg5];
    
        bg6 = [SKSpriteNode spriteNodeWithImageNamed:@"background6"];
        bg6.anchorPoint = CGPointZero;
        bg6.position = CGPointMake(bg5.size.width-1, 0);
        [self addChild:bg6];
    
        bg7 = [SKSpriteNode spriteNodeWithImageNamed:@"background7"];
        bg7.anchorPoint = CGPointZero;
        bg7.position = CGPointMake(bg6.size.width-1, 0);
        [self addChild:bg7];
    }
    }
    
    - (void)update:(NSTimeInterval)currentTime {
    [self moveBackground];
    }
    
    -(void)moveBackground
    {   
    bg1.position = CGPointMake(bg1.position.x-4, bg1.position.y);
    bg2.position = CGPointMake(bg2.position.x-4, bg2.position.y);
    bg3.position = CGPointMake(bg3.position.x-4, bg3.position.y);
    bg4.position = CGPointMake(bg4.position.x-4, bg4.position.y);
    bg5.position = CGPointMake(bg5.position.x-4, bg5.position.y);
    bg6.position = CGPointMake(bg6.position.x-4, bg6.position.y);
    bg7.position = CGPointMake(bg7.position.x-4, bg7.position.y);
    
    if (bg1.position.x < -bg1.size.width){
        bg1.position = CGPointMake(bg7.position.x + bg7.size.width, bg1.position.y);
    }
    
    if (bg2.position.x < -bg2.size.width) {
        bg2.position = CGPointMake(bg1.position.x + bg1.size.width, bg2.position.y);
    }
    
    if (bg3.position.x < -bg3.size.width) {
        bg3.position = CGPointMake(bg2.position.x + bg2.size.width, bg3.position.y);
    }
    
    if (bg4.position.x < -bg4.size.width) {
        bg4.position = CGPointMake(bg3.position.x + bg3.size.width, bg4.position.y);
    }
    
    if (bg5.position.x < -bg5.size.width) {
        bg5.position = CGPointMake(bg4.position.x + bg4.size.width, bg5.position.y);
    }
    
    if (bg6.position.x < -bg6.size.width) {
        bg6.position = CGPointMake(bg5.position.x + bg5.size.width, bg6.position.y);
    }
    
    if (bg7.position.x < -bg7.size.width) {
        bg7.position = CGPointMake(bg6.position.x + bg6.size.width, bg7.position.y);
    }
    }
    
    0 讨论(0)
  • 2020-12-23 19:05

    The original logic that has a for loop works fine with minor changes:

    for (int i = 0; i < 2; i++) {
            SKSpriteNode * bg = [SKSpriteNode spriteNodeWithImageNamed:@"bgimage"];
            bg.anchorPoint = CGPointZero;
            bg.position = CGPointMake(i*bg.size.width, 0);
            bg.name = @"snow1";
            [self addChild:bg];
        }
    

    And in the update method:

    [self enumerateChildNodesWithName:@"snow1" usingBlock: ^(SKNode *node, BOOL *stop) {
    SKSpriteNode *bg = (SKSpriteNode *) node;
    
    bg.position = CGPointMake(bg.position.x - 5, bg.position.y);
    
    if (bg.position.x <= -bg.size.width) {
        bg.position = CGPointMake(bg.position.x + bg.size.width * 2, bg.position.y);
    }
    }];
    
    0 讨论(0)
提交回复
热议问题