ios - SpriteKit 滚动底部在循环时有间隙

标签 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

最佳答案

我要做的是:

// 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 的实例变量,因此重新定位总是与此 Sprite 相关。

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

我曾经像示例中那样做,并且效果很好。让我知道它是怎么做到的。

关于ios - SpriteKit 滚动底部在循环时有间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26085627/

相关文章:

objective-c - 帮助 Xcode - 类 'secondview' 的错误实现 + 找不到 '-switchview:' 的方法定义

ios - 我遇到了一个奇怪的 SpriteKit AdMob 错误,有点令人困惑

Swift - 太空侵略者(外星人显示循环不工作)

ios - SpriteKit,Swift - ScrollView 未显示

ios - IBM Worklight - 应用程序在应用 FixPack 后卡在初始屏幕

ios - 使用文本字段设置 rxSwift?

ios - WebP 集成和 arm64

objective-c - 与 NSWindowController 窗口 socket 作斗争

android - 如何在Android/iOS中释放组件

ios - "_nano_vet_and_size_of_live"仅在 iOS 10 中出现崩溃