Как я могу переместить эти фоновые изображения вертикально, а не горизонтально в cocos2d? - PullRequest
0 голосов
/ 02 марта 2012

У меня есть эта функция 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 Ответ

3 голосов
/ 02 марта 2012

Теперь у вас есть запись рабочего кода (ваш вопрос здесь), поэтому перейдите к коду и сделайте его вертикальным.

A position в cocos2d представляет центр вашего фона.

position.x - горизонтальный компонент, а position.y - вертикальный компонент.

Установка новых позиций с помощью ccp может рассматриваться как

background.position = ccp(newX,newY);

Если бы мы сделали модификацию для вас, мы бы отняли у вас хороший опыт обучения.Попробуйте и обновите свой вопрос, когда вы приблизились, но все еще застряли.

Обновите ... Итак

Давайте посмотрим на одну из строк кода, которые вы изменили

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

Это не будет делать то, что вы хотите, потому что вы только переключили x <-> y и width <-> height. Не бойтесь писать более длинный код, если вы не можете получитьдля работы с коротким кодом (вы должны узнать, прежде чем писать короткий код)

Для одной строки, на которой мы сосредоточены, давайте разберем ее для работы.

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

Где бы вы ни находились, ваш исходный код был написан кем-то, кому это удобно.4 строки кода, заменяющие 1, не так хороши, но они помогут вам понять процесс.

Обновление

Вот пример того, как верхний блок вашего кода сменится на работу.Я полагаю, вы должны увидеть движение двух фонов.Это основано на предположении, что ваша первая функция 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....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...