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中的循环背景的主要内容,如果未能解决你的问题,请参考以下文章
我的第一个 iPhone 的 Cocos2d 应用程序中的问题?
iPhone OpenGL ES 2.0 与 Cocos2D 的混合产生了意想不到的结果