3

我必须在 iOS Coco2d 中移动背景图像,但我遇到了一些困难。我尝试了一些网站上提供的一些解决方案,但未能成功让它们正常工作。以下是我目前正在处理的代码:-

背景第一次平滑移动,但之后无法正常工作:-

初始化函数中的代码:-

bg1 = [CCSprite spriteWithFile: @"bg1.png"];
bg1.anchorPoint = CGPointZero;
[self addChild:bg1 z:-2];

bg2 = [CCSprite spriteWithFile: @"bg1.png"];
[self addChild:bg2 z:-3];
bg2.anchorPoint = CGPointMake(480, 0);

// schedule a repeating callback on every frame
[self schedule:@selector(nextFrame:) interval:.4f];

- (void) nextFrame:(ccTime)dt {
    id actionMove = [CCMoveTo actionWithDuration:.4 position:ccp(bg1.position.x - 100 * dt, bg1.position.y)]; //winSize.height/2)];

    id actionMove1 = [CCMoveTo actionWithDuration:.4 position:ccp(bg2.position.x - 100 * dt, bg2.position.y)]; //winSize.height/2)];

    id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
    [bg1 runAction:[CCSequence actions:actionMove,actionMoveDone, nil]];
    [bg2 runAction:[CCSequence actions:actionMove1,actionMoveDone, nil]];   
}

-(void)spriteMoveFinished:(id)sender {

    CCSprite *sprite = (CCSprite *)sender;
    if(sprite == bg1) {
        if (bg1.position.x < -480) {
            [self removeChild:bg1 cleanup:NO];
            bg1.position = ccp( 480 , bg1.position.y );

            [self addChild:bg1 z:-2];
        }
    }
    else if(sprite == bg2)
        if (bg2.position.x < -480) {
            [self removeChild:bg2 cleanup:NO];
            bg2.position = ccp( bg1.position.x+ 480 , bg1.position.y );
            [self addChild:bg2 z:-3];
        }
    }
}
4

2 回答 2

0

试试这个,确保你翻转背景 2。

 #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
 #define MM_BG_SPEED_DUR       ( IS_IPAD ? (6.0f) : (2.0f) )

-(void)onEnter
{
    [super onEnter];
    [self initBackground];

    [self schedule: @selector(tick:)];
}

-(void)initBackground
{
   NSString *tex = @"BG/Background.png";//[self getThemeBG];

    mBG1 = [CCSprite spriteWithFile:tex];
    mBG1.position = ccp(s.width*0.5f,s.height*0.5f);
    [self addChild:mBG1 z:LAYER_BACKGROUND];

    mBG2 = [CCSprite spriteWithFile:tex];
    mBG2.position = ccp(s.width+s.width*0.5f,s.height*0.5f);

    mBG2.flipX = true;
    [self addChild:mBG2 z:LAYER_BACKGROUND];

}


-(void)scrollBackground:(ccTime)dt
{
    CGSize s = [[CCDirector sharedDirector] winSize];

    CGPoint pos1 = mBG1.position;
    CGPoint pos2 = mBG2.position;

    pos1.x -= MM_BG_SPEED_DUR;
    pos2.x -= MM_BG_SPEED_DUR;


    if(pos1.x <=-(s.width*0.5f) )
    {
        pos1.x = pos2.x + s.width;
    }

    if(pos2.x <=-(s.width*0.5f) )
    {
        pos2.x = pos1.x + s.width;
    }

    mBG1.position = pos1;
    mBG2.position = pos2;

}

-(void)tick:(ccTime)dt
{
    [self scrollBackground:dt];
}
于 2013-02-16T07:33:11.840 回答
0

我认为这种方式更简单一些。您初始化背景init并将它们移入update.

在初始化方法中:

// position backgrounds
CCSprite *bg1 = [CCSprite spriteWithSpriteFrame:spriteFrame];
CCSprite *bg2 = [CCSprite spriteWithSpriteFrame:spriteFrame];
CCSprite *bg3 = [CCSprite spriteWithSpriteFrame:spriteFrame];
bg1.anchorPoint = ccp(0, 0);
bg1.position = ccp(0, 0);
bg2.anchorPoint = ccp(0, 0);
bg2.position = ccp(bg1.contentSize.width-1, 0);
bg3.anchorPoint = ccp(0, 0);
bg3.position = ccp(2*bg1.contentSize.width-1, 0);
_backgrounds = @[bg1, bg2, bg3];

[self addChild:bg1 z:INT_MIN];
[self addChild:bg2 z:INT_MIN];
[self addChild:bg3 z:INT_MIN];

在更新方法中:

// endless scrolling for backgrounds
for (CCSprite *bg in _backgrounds) {
    bg.position = ccp(bg.position.x - 50 * delta, bg.position.y);
    if (bg.position.x < -1 * (bg.contentSize.width)) {
        bg.position = ccp(bg.position.x + (bg.contentSize.width*2)-2, 0);
    }
}

注:代码适用于 Cocos2d 3.0

于 2014-02-08T17:31:53.963 回答