我正在尝试实现横向视差滚动,它适用于iPhone 4和新的iPhone 5.我开始使用宽度为1136像素(HD)的精灵,并认为我也可以使用相同的iPhone 4 。问题是它不再适用于iPhone 4。如果您使用的是iPhone 5,屏幕尺寸和精灵尺寸是相同的。在iPhone 4上不会这样,在你达到1136px的侧向运动(即精灵/ iPhone 5的屏幕长度)后会导致精灵的替换。
如何实现无限的视差滚动,与屏幕尺寸/精灵尺寸比无关?
这是更新精灵的代码,以便它们无限制地进行(基于Itterheim的新Cocos2D 2书的代码):
for (CCSprite* sprite in spriteBatch.children)
{
NSNumber* factor = [speedFactors objectAtIndex:sprite.zOrder];
CGPoint pos = sprite.position;
pos.x -= (scrollSpeed * factor.floatValue) * (delta * 50);
// Reposition stripes when they're out of bounds
CGSize screenSize = [CCDirector sharedDirector].winSize;
if (pos.x < -screenSize.width)
{
pos.x += (screenSize.width * 2) - 2;
}
sprite.position = pos;
}
以下是其背景:
@implementation ParallaxBackground
-(id) init
{
if ((self = [super init]))
{
CGSize screenSize = [[CCDirector sharedDirector] winSize];
// Get the game's texture atlas texture by adding it. Since it's added already it will simply return
// the CCTexture2D associated with the texture atlas.
CCTexture2D* gameArtTexture = [[CCTextureCache sharedTextureCache] addImage:@"game-art.pvr.ccz"];
// Create the background spritebatch
spriteBatch = [CCSpriteBatchNode batchNodeWithTexture:gameArtTexture];
[self addChild:spriteBatch];
bgLayerTotal = 3;
// Add the 6 different layer objects and position them on the screen
for (int i = 0; i < bgLayerTotal; i++)
{
NSString* frameName = [NSString stringWithFormat:@"bg%i.png", i];
CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:frameName];
sprite.anchorPoint = CGPointMake(0, 0.5f);
sprite.position = CGPointMake(0, screenSize.height / 2);
[spriteBatch addChild:sprite z:i];
}
// Add 7 more stripes, flip them and position them next to their neighbor stripe
for (int i = 0; i < bgLayerTotal; i++)
{
NSString* frameName = [NSString stringWithFormat:@"bg%i.png", i];
CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:frameName];
// Position the new sprite one screen width to the right
sprite.anchorPoint = CGPointMake(0, 0.5f);
sprite.position = CGPointMake(screenSize.width - 1, screenSize.height / 2);
// Flip the sprite so that it aligns perfectly with its neighbor
sprite.flipX = YES;
// Add the sprite using the same tag offset by numStripes
[spriteBatch addChild:sprite z:i tag:i + bgLayerTotal];
}
// Initialize the array that contains the scroll factors for individual stripes.
speedFactors = [NSMutableArray arrayWithCapacity:bgLayerTotal];
[speedFactors addObject:[NSNumber numberWithFloat:0.1f]];
[speedFactors addObject:[NSNumber numberWithFloat:3.0f]];
[speedFactors addObject:[NSNumber numberWithFloat:4.0f]];
NSAssert(speedFactors.count == (unsigned int)bgLayerTotal, @"speedFactors count does not match bgLayerTotal!");
scrollSpeed = 1.0f;
[self scheduleUpdate];
}
return self;
}
-(void) update:(ccTime)delta
{
for (CCSprite* sprite in spriteBatch.children)
{
NSNumber* factor = [speedFactors objectAtIndex:sprite.zOrder];
CGPoint pos = sprite.position;
pos.x -= (scrollSpeed * factor.floatValue) * (delta * 50);
// Reposition stripes when they're out of bounds
CGSize screenSize = [CCDirector sharedDirector].winSize;
if (pos.x < -screenSize.width)
{
pos.x += (screenSize.width * 2) - 2;
}
sprite.position = pos;
}
}
答案 0 :(得分:1)
不是使用屏幕大小来重复背景,而是使用最大背景精灵的宽度(或bg碎片的宽度之和,如果它们被分解)。您也可以将最大宽度硬编码为1136。
所以,改变:
CGSize screenSize = [CCDirector sharedDirector].winSize;
if (pos.x < -screenSize.width)
{
pos.x += (screenSize.width * 2) - 2;
}
类似于:
CCSprite *bg = (CCSprite*)[spriteBatch getChildByTag:0];
if (pos.x < -bg.contentSize.width)
{
pos.x += (bg.contentSize.width * 2) - 2;
}