我正在开发我的第一个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);
}
}
}
这有效,但有两个问题。首先,它在第二次循环后产生间隙,然后间隙保持在那里。另一个问题是,当他们向左移动屏幕时,背景的不同部分似乎“摆动”。这导致单独的精灵有时可能超过一圈。我不能拥有。我哪里错了?提前谢谢!
答案 0 :(得分:0)
我已经为垂直滚动射击游戏实现了ParallaxBackground,这是我的更新方法。我希望它能帮助激励你,因为我在开始时也遇到了差距问题。
Te speedFactors是一个浮动对象数组,用于确定背景的每个条纹的速度。我将numStripes乘以2,因为我有一个顶部和底部条纹(图像分成两半)所以当它们从视觉范围出去时我可以重新定位它们(条件: if(pos.y&lt; -screenSize.height) 强>)。
sprite作为childs添加到类中,但如果你愿意,也可以使用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:对于记录,我的方法和类是来自this book中的ShootEmUp示例的ParallaxBackground类的修改。你可以在链接中找到源代码,我建议你也买这本书。
PPS:为了避免1像素的间隙,你需要在重新定位精灵时删除它,为了避免背景精灵的间隙你需要分配两个背景精灵的实例并在屏幕上交替它们(当一个是从视觉范围中你重新定位它在屏幕的开始 - 顶部或侧面,在你的情况下 - )然后你继续移动两个背景精灵..如果你看到我的代码或更多的PrallaxBackground示例在书中你会明白的。