Cocos2d изменить место назначения спрайта

Хорошо, поехали. У меня есть приложение cocos2d, и есть цели, которые движутся к игроку. Когда игрок движется, я хотел бы, чтобы он снова медленно менял свое место назначения в сторону игрока, чтобы он не просто двигался в пустое пространство. Можно ли изменить место назначения спрайта в середине действия?

изменить:

Это код в - (void)changeTargetDest

- (void)changeTargetDest {
    NSMutableArray* deleteArray = [[NSMutableArray alloc] init];
    for(CCSprite* s in _targets) {
        float offX = s.position.x - player.position.x;
        float offY = s.position.y - player.position.y;
        float adjustX;
        float adjustY;
        float offDistance = sqrt(powf(offX, 2.0f) + powf(offY, 2.0f));

        if(offDistance < 15) {
            [deleteArray addObject:s];

            deaths++;
            [deathLabel setString:[NSString stringWithFormat:@"Deaths: %ld", deaths]];
            if(deaths == 0)
            [kdLabel setString:[NSString stringWithFormat:@"K/D ratio: %ld.00", score]];
            else
                [kdLabel setString:[NSString stringWithFormat:@"K/D ratio: %.2f", ((float)score / (float)deaths)]];
        }

        else {
            adjustX = offX * .99;
            adjustY = offY * .99;

            CGPoint point = CGPointMake(player.position.x + adjustX, player.position.y + adjustY);

            [s setPosition:point];
        }//else

    }//for

    for (CCSprite *target in deleteArray) {

        [_targets removeObject:target];
        [self removeChild:target cleanup:YES];                                  
    }
}

Это работает хорошо, за исключением одной проблемы. Поскольку новая позиция вычисляется путем простого взятия 0,99 предыдущего смещения, чем ближе цель оказывается к игроку, тем медленнее она движется. Как я могу сделать его скорость постоянной?


person eric.mitchell    schedule 02.11.2011    source источник


Ответы (1)


Вы можете остановить действие и запускать новое действие каждые несколько кадров в запланированном методе. но лучший способ - вычислить положение целей в соответствии с положением игроков и использовать setPosition для ручного изменения их положения в каждом кадре в вашем методе обновления.

person Abbas Mousavi    schedule 02.11.2011
comment
Точно. Действия будут отставать на 1 кадр. Как только вы дойдете до ситуации, когда будете создавать новое действие перемещения в каждом кадре, спрайт застынет на месте и не будет двигаться. - person LearnCocos2D; 02.11.2011
comment
Смотрите мою правку, пожалуйста. С этим кодом спрайты делают именно то, что вы сказали: они вообще не двигаются. - person eric.mitchell; 03.11.2011
comment
В вашем коде в каждом кадре вы запускаете действие и останавливаете другое действие, таким образом, спрайт не будет двигаться, действия не подходят для перемещения одного кадра, если вы хотите перемещать свои спрайты в каждом кадре, вы должны установить положение вручную с установленной позицией, каждый кадр. - person Abbas Mousavi; 03.11.2011
comment
Как именно я буду использовать setPosition для перемещения цели к игроку каждые пару кадров? - person eric.mitchell; 05.11.2011
comment
ваши offX и offY указывают вектор от вашего игрока к цели, и вы предполагаете скорость для целей, поэтому в вашем методе обновления каждый кадр вычисляет новую позицию, вычисляя движение в этом векторном направлении по этой скорости и устанавливая новую позицию с помощью setPosition. - person Abbas Mousavi; 05.11.2011
comment
если вы хотите, чтобы цели двигались с постоянной скоростью, вы должны использовать что-то вроде этого normalOffX = offX/offDistance; normalOffY = offY/offDistance; move = CGPointMake (speed *dt * normalOffX, speed*dt*normalOffY); [s setPosition:ccpAdd(s.position, move)]; - person Abbas Mousavi; 05.11.2011
comment
dt — это время, прошедшее с момента последнего обновления, вы можете взять его из метода обновления, скорость — это постоянная скорость, которую вы хотите, она нормализует вектор расстояния, затем вычисляет перемещение, умножая скорость на время, а затем добавляет движение в направлении вектора расстояния к текущая позиция цели - person Abbas Mousavi; 05.11.2011
comment
dt — это параметр, отправляемый запланированным методам, таким как метод обновления, и показывает время, прошедшее между двумя вызовами запланированного метода. если вы вызываете свой changeTargetDest из запланированного метода, вы можете отправить dt, который отправляется методу, вашему методу. - person Abbas Mousavi; 06.11.2011