重复垂直滚动图像的问题

时间:2014-03-18 13:30:34

标签: objective-c cocos2d-iphone ccsprite

我正在尝试从上到下创建重复背景。我有实际滚动的背景,但是每次重复都会出现黑色区域​​。我不完全确定为什么会发生这种情况......以下是我的代码:

- (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像素。

1 个答案:

答案 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:方法。您不希望在代码中传播这些计算。

需要考虑的更多要点:

  • 在将新位置应用于节点的位置属性之前,仅在您的位置计算结束时进行一次轮次
  • 您可能需要将相同的圆形程序应用于父级的位置,例如,如果您更改两个拼贴精灵及其父级(即图层或容器节点)的位置