cocos2d iPhone中的循环背景

Posted

技术标签:

【中文标题】cocos2d iPhone中的循环背景【英文标题】:Looping background in cocos2d iPhone 【发布时间】:2012-04-13 00:50:11 【问题描述】:

我正在开发我的第一个 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); 
    


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

【问题讨论】:

为什么会有第二个 for 循环?通过条件 "sprt.tag == bckgrnd.tag" 的 sprt 不是和你已经拥有的 bckgrnd... 一样吗? 【参考方案1】:

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

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

精灵作为子类添加到类中,但如果您愿意,也可以使用 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;
        
       

希望对您有所帮助,请不要犹豫,通过 cmets 进一步提问。

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

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

【讨论】:

以上是关于cocos2d iPhone中的循环背景的主要内容,如果未能解决你的问题,请参考以下文章

滚动背景图片切成两半 - cocos2d

cocos2d iphone中的FBconnect问题?

我的第一个 iPhone 的 Cocos2d 应用程序中的问题?

iPhone OpenGL ES 2.0 与 Cocos2D 的混合产生了意想不到的结果

从 iPhone 和 Cocos2d 中的类类型(+)方法访问对象?

适用于iPhone的Cocos2d中的整数对