如何在cocos2d中垂直移动这些背景图像而不是水平移动?

时间:2012-03-02 01:23:55

标签: iphone objective-c ios cocos2d-iphone

我有这个void函数可以水平移动两个背景图像,但我想垂直移动:

-(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);
    }
}

更新我的代码:

因为我不想改变x坐标我想让我改变y,所以图像可以垂直移动!

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

    }

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

但随着改变我只得到第一个背景,并且没有滚动:(

后台初始化代码:

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

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

        //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];

我对cocos2d真的很新,我真的不明白这是如何工作的,谢谢!

1 个答案:

答案 0 :(得分:3)

现在您已经记录了工作代码(这里是您的问题),因此请跳转代码并使其垂直。

cocos2d中的position表示背景的中心。

position.x是水平分量,position.y是垂直分量。

使用ccp设置新职位可以被视为

background.position = ccp(newX,newY);

如果我们为您做了修改,我们就会剥夺您良好的学习体验。在你离得更近的时候试一试并更新你的问题,但仍然卡住了。

...更新 所以

让我们看一下你改变的代码行之一

    background.position = ccp(background.position.y - 30*dt,background.contentSize.width/2);

这不会做你想要的,因为你只改变了x&lt; - &gt; y和宽度&lt; - &gt;高度 如果你不能使用短代码(在编写短代码之前必须学习),不要害怕编写更长的代码。

对于我们关注的一行,让我们分解它。

float bgOldX = background.position.x;
float bgOldY = background.position.y;
float bgNewY = bgOldY - 30*dt;
// no need for newX because we are moving horizontally
background.position = ccp(bgOldX,bgNewY);

无论你在哪里获得原始代码都是由一个对这类东西感到满意的人写的。替换1的4行代码不是很漂亮,但它可以帮助您理解该过程。

更新

这是让您的代码的顶部块更改工作的镜头。我相信你应该看到两个背景在移动。这是基于您的第一个void函数正在运行的假设。如果您无法让重置位置工作,我将很乐意进一步提供帮助。

-(void) scroll:(ccTime)dt 
{
    // i am not too fond of my variable names
    //move 30*dt px vertically
    float bgOldX = background.position.x;
    float bgOldY = background.position.y;
    float bg2OldX = background2.position.x;
    float bg2OldY = background2.position.y;
    float bgNewY,bg2NewY;
    // no need for newX because we are moving horizontally
    if (background.position.y<background2.position.y){
        bgNewY = bgOldY-30dt;
        bg2NewY = bgNewY+background.contentSize.height;
        background.position = ccp(bgOldX,bgNewY);
        background2.position = ccp(bg2OldX, bg2NewY);    
    }else{
        bg2NewY = bg2OldY-30dt;
        bgNewY = bg2NewY+background2.contentSize.height;
        background.position = ccp(bgOldX,bgNewY);
        background2.position = ccp(bg2OldX, bg2NewY);    
    }

    //reset offscreen position    
    //reset offscreen position
    // etc....
}