循环时SpriteKit滚动底部有差距

时间:2014-09-28 14:00:31

标签: ios xcode sprite-kit skspritenode

在我的应用程序中,我有一个充当地面的图像,并沿着底部滚动。我初始化并滚动它:

 -(void)initalizingScrollingBackground
    {
        for (int i = 0; i < 2; i++)
        {
            SKSpriteNode *bg = [SKSpriteNode spriteNodeWithImageNamed:@"Bottom_Scroller"];
            bg.zPosition = BOTTOM_BACKGROUND_Z_POSITION;
            bottomScrollerHeight = bg.size.height;
            bg.position = CGPointMake((i * bg.size.width) + (bg.size.width * 0.5f) - 1, bg.size.height * 0.5f);
            bg.name = @"bg";
            bg.physicsBody = [SKPhysicsBody bodyWithTexture:bg.texture size:bg.texture.size];


            bg.physicsBody.categoryBitMask = bottomBackgroundCategory;


            bg.physicsBody.contactTestBitMask = flappyBirdCategory;


            bg.physicsBody.collisionBitMask = 0;


            bg.physicsBody.affectedByGravity = NO;
            [self addChild:bg];
        }
    }

- (void)moveBottomScroller
{
    [self enumerateChildNodesWithName:@"bg" usingBlock: ^(SKNode *node, BOOL *stop)
     {
         SKSpriteNode * bg = (SKSpriteNode *) node;
         CGPoint bgVelocity = CGPointMake(-BG_VELOCITY, 0);
         CGPoint amtToMove = CGPointMultiplyScalar(bgVelocity,_dt);
         bg.position = CGPointAdd(bg.position, amtToMove);

         //Checks if bg node is completely scrolled of the screen, if yes then put it at the end of the other node
         if (bg.position.x + bg.size.width * 0.5f <= 0)
         {
             bg.position = CGPointMake(bg.size.width*2 - (bg.size.width * 0.5f) - 2,
                                       bg.position.y);
         }
     }];
}

然而,在它滚动这么久之后,它会显示出一个间隙,如下所示。我该如何解决这个问题?

enter image description here

1 个答案:

答案 0 :(得分:2)

我要做的是:

// This would go in the init or didMoveToView method of your scene
const NSUInteger numBgs = 3;
for (NSUInteger i = 0; i < numBgs; i++) {
    CGFloat color = 0.2f * i;
    SKSpriteNode *bg = [SKSpriteNode spriteNodeWithColor:[UIColor colorWithRed:color green:color blue:color alpha:1.0] size:CGSizeMake(512, 300)];
    bg.anchorPoint = CGPointMake(0.5, 0); 
    bg.position = CGPointMake((i * bg.size.width) + (bg.size.width * 0.5f), CGRectGetMinY(self.frame));
    bg.name = @"bg";
    [self addChild:bg];

    if (i == numBgs-1) { // Means it's last bg on the right
        lastBg = bg;
    }
}

[self enumerateChildNodesWithName:@"bg" usingBlock:^(SKNode *node, BOOL *stop) {
    SKSpriteNode * bg = (SKSpriteNode *) node;

    //Checks if bg node is completely scrolled of the screen, if yes then put it at the end of the other node
    if (bg.position.x + bg.size.width * 0.5f <= 0)
    {
        bg.position = CGPointMake(lastBg.position.x + bg.frame.size.width,
                                  bg.position.y);
        lastBg = bg;
    }


    CGPoint bgVelocity = CGPointMake(-BG_VELOCITY, 0);
    CGPoint amtToMove = CGPointMultiplyScalar(bgVelocity,_dt);
    bg.position = CGPointAdd(bg.position, amtToMove);

}];

其中lastBg是指向位于最右侧的bg的实例变量,因此重新定位总是相对于此精灵。

您可以尝试的其他事情是在重新定位之前切换位置检查(如我在示例中所做的那样),并且还删除了枚举块的检出并独立于重新定位而执行此操作。

我曾经在示例中做过,但它工作得很好。让我知道它是如何做的。