0

我正在开发我的第一个 cocos2d 游戏。它将有一个循环背景,三个不同的层都以不同的速度循环。循环的速度将根据用户输入而改变。

这是我的做法

-(void) update: (ccTime) dt
{
for (CCSprite *bckgrnd in backgroundArray){
    switch (bckgrnd.tag) {
        case 0:
            bckgrnd.position = ccp(bckgrnd.position.x - speed * .30, bckgrnd.position.y);
            break;
        case 1:
            bckgrnd.position = ccp(bckgrnd.position.x - speed * .80, bckgrnd.position.y);
            break;
        case 2:
            bckgrnd.position = ccp(bckgrnd.position.x - speed * .50, bckgrnd.position.y);
            break;

        default:
            break;
    }
    if (bckgrnd.position.x <= -kBacWidth) {
        CGPoint greatestPosition = CGPointMake(0, 0);
        for (CCSprite *sprt in backgroundArray){
            if (sprt.tag == bckgrnd.tag && sprt.position.x > greatestPosition.x) {
                greatestPosition = CGPointMake(sprt.position.x, sprt.position.y);
            }
        }

        bckgrnd.position = ccp(greatestPosition.x + kBacWidth, bckgrnd.position.y); 
    }
}
}

这可行,但有两个问题。首先,它在第二次循环后会产生一个间隙,然后该间隙会保持在那里。另一个问题是背景的不同部分在屏幕向左移动时似乎“摆动”。这会导致单独的精灵有时会重叠一个像素。我不能拥有。我哪里错了?提前致谢!

4

1 回答 1

0

我已经为垂直滚动射击游戏实现了 ParallaxBackground,这是我的更新方法。我希望它确实有助于激发你的灵感,因为我一开始也遇到了差距问题。

speedFactors 是一个浮点对象数组,它决定了背景中每个条纹的速度。我将 numStripes 乘以 2,因为我有一个顶部和底部条纹(图像分成两半),所以当它们超出可视范围时我可以重新定位它们(​​条件:if(pos.y < -screenSize.height))。

精灵作为子类添加到类中,但如果您愿意,也可以使用 CCSpriteBatch 或 backgroundArray。

-(void) update:(ccTime)delta
{
    CCSprite* sprite;
    int factorIndex=0;
    for (int i=0; i<(numStripes*2); i++) {

        sprite = (CCSprite*)[self getChildByTag:firstParallaxSpriteTag+i];

        NSNumber* factor = [speedFactors objectAtIndex:factorIndex];

        CGPoint pos = sprite.position;
        pos.y -= scrollSpeed * [factor floatValue];;

        // Reposition stripes when they're out of bounds
        if (pos.y < -screenSize.height)
        {
            pos.y += (screenSize.height * 2) - 2;
        }
        sprite.position = pos;   
        factorIndex++;
        if(factorIndex>=numStripes){
            factorIndex=0;
        }
    }   
}

希望这对您有所帮助,请不要犹豫,通过评论提出进一步的问题。

PS:为了记录,我的方法和类是对本书中 ShootEmUp 示例中的 ParallaxBackground 类的修改。您可以在链接中找到源代码,我建议您也购买这本书。

PPS:为了避免 1 像素的间隙,您需要在重新定位精灵时将其移除,为了避免背景精灵的间隙,您需要分配背景精灵的两个实例并在屏幕中交替它们(当一个从视觉范围,您将其重新定位在屏幕的开头或侧面,在您的情况下是侧面-),然后继续移动两个背景精灵。如果您看到我的代码甚至更多书中的 PrallaxBackground 示例,您就会明白。

于 2012-06-15T23:01:21.960 回答