我正在尝试从上到下创建重复背景。我有实际滚动的背景,但是每次重复都会出现黑色区域。我不完全确定为什么会发生这种情况......以下是我的代码:
- (void)onEnter
{
[super onEnter];
[self initBackground];
}
-(void)initBackground
{
NSString *backgroundImage = @"Stars.png";//[self getThemeBG];
background1 = [CCSprite spriteWithImageNamed:backgroundImage];
background1.position = ccp(self.contentSize.width*0.5f,self.contentSize.height*0.5f);
[self addChild:background1 z:-123];
background2 = [CCSprite spriteWithImageNamed:backgroundImage];
background2.position = ccp(self.contentSize.width*0.5f,self.contentSize.height*0.5f+background1.contentSize.height);
background2.flipY = true;
[self addChild:background2 z:-456];
}
-(void)scrollBackground:(CCTime)dt
{
CGSize s = [[CCDirector sharedDirector] viewSize];
CGPoint pos1 = background1.position;
CGPoint pos2 = background2.position;
pos1.y -= kScrollSpeed;
pos2.y -= kScrollSpeed;
if(pos1.y <=-(s.height*0.5f) )
{
pos1.y = pos2.y + background2.contentSize.height;
}
if(pos2.y <=-(s.height*0.5f) )
{
pos2.y = pos1.y + background1.contentSize.height;
}
background1.position = pos1;
background2.position = pos2;
}
-(void)update:(CCTime)delta
{
[self scrollBackground:delta];
}
我已将kScrollSpeed定义为3,backgroundImage1和2都是CCSprites。我不完全确定每个周期出现黑色区域的原因。
背景图像的尺寸为640 x 1136像素。
答案 0 :(得分:1)
解决平铺图形的“黑线”问题的技巧,特别是对于cocos2d,但也适用于Sprite Kit和其他渲染引擎,是为了确保在精确的像素边界上绘制内容。
唯一的方法是确保将位置转换为整数,或者将Retina转换到下一个最接近的“半点”(即在Retina 123.5上是有效的精确像素坐标,但不在非Retina设备上)。< / p>
完全执行舍入的位置取决于您的代码,但通常不是这样做的:
background1.position = pos1;
你需要这样做:
pos1.x = round(pos1.x * 2.0) / 2.0;
pos1.y = round(pos1.y * 2.0) / 2.0;
background1.position = pos1;
通常建议使用强制转换为int,但这意味着在Retina设备上,您的内容只会在2像素的边界上移动。上面的解决方案不使用int转换,但依赖于舍入以允许.5坐标。它在标准和Retina分辨率设备上同样有效。
PS:我强烈建议为上述舍入代码创建辅助函数或覆盖setPosition:
方法。您不希望在代码中传播这些计算。
需要考虑的更多要点: