Cocos2D vertically scrolling background

2019-03-10 11:04发布

问题:

I have three images (320x480) that I'm trying to scroll vertically in my Cocos2D application.

In my initialization method, I have the following:

//adding background sprites
background = [CCSprite spriteWithFile:@"BG1.png"];
background2 = [CCSprite spriteWithFile:@"BG2.png"];

//position background sprites
background.position = ccp(size.width, size.height/2);
background2.position = ccp(size.width, size.height*2);

//schedule to move background sprites
[self schedule:@selector(scroll:)];

//adding them to the main layer
[self addChild:background z:0];
[self addChild:background2 z:0];

And here's my scroll method:

-(void) scroll:(ccTime)dt 
{
//move 30*dt px vertically
background.position = ccp(background.position.x, background.position.y - 30*dt);
background2.position = ccp(background2.position.x, background.position.y - 30*dt);

//reset offscreen position
if (background.position.y < 290)
{
    background.position = ccp(480/2, 480);
}else if (background2.position.y < 290)
{
    background2.position = ccp(480/2,480);
}
}

Currently what's happening is my first background image is offset by about a quarter of the screen (horizontally), and it starts a quarter of the way up from the bottom of the screen, but it scrolls down. My second background image doesn't actually spawn, the first image just loops over and over while being offset. Is there any way to make the two images smoothly loop continuously in the background, and how would I incorporate a third image?

Also, just a quick side question, is it bad to name objects (I think they're objects) with numbers in their name (ie background2/background3)?

回答1:

Tested for horizontal scrolling in landscape mode (all you have to do is change the scrolling from horizontal to vertical, you should be able to figure this out) dont forget that ccposition is from the middle of the sprite, not from 0,0 perspective...:

    CGSize size = [CCDirector sharedDirector].winSize;

    //adding background sprites
    background = [CCSprite spriteWithFile:@"tracktest.png"];
    background2 = [CCSprite spriteWithFile:@"tracktest.png"];
    [background.texture setAliasTexParameters];
    [background2.texture setAliasTexParameters];

    //position background sprites
    background.position = ccp(background.contentSize.height/2,background.contentSize.width/2);
    background2.position = ccp(size.width,0);

    //schedule to move background sprites
    [self schedule:@selector(scroll:)];

    //adding them to the main layer
    [self addChild:background z:0];
    [self addChild:background2 z:0];

-scroll method:

-(void) scroll:(ccTime)dt 
{
        //move 30*dt px vertically
  if (background.position.x<background2.position.x){
      background.position = ccp(background.position.x - 30*dt,background.contentSize.height/2);
      background2.position = ccp(background.position.x+background.contentSize.width,background2.contentSize.height/2);
  }else{
      background2.position = ccp(background2.position.x- 30*dt,background2.contentSize.height/2);
      background.position = ccp(background2.position.x+background2.contentSize.width ,background.contentSize.height/2);

  }

  //reset offscreen position
  if (background.position.x <-background.contentSize.width/2)
  {
      background.position = ccp(background2.position.x+background2.contentSize.width,background.contentSize.width/2);
  }else if (background2.position.x < -background2.contentSize.width/2)
  {
      background2.position = ccp(background.position.x+background.contentSize.width, background2.contentSize.width/2);
  }
}