Sprite прыгает вокруг, когда я использую resumeSchedulerAndActions

Хорошо, я пытаюсь кое-что из ИИ здесь и следую некоторым учебникам Рэя Вендерлиха. У меня происходит странное поведение. Может быть, я просто делаю все это неправильно... но вот, пожалуйста. Когда спрайт находится в пределах 75 пикселей от цели, он переключается на защиту AIState и я звоню pauseSchedulerAndActions и установить его в заранее определенном безопасном месте с помощью getDefensePosition метод. Я пытаюсь через 2 секунды возобновить действия, чтобы спрайт снова начал двигаться. так я звоню resumeSchedulerAndActions, Теперь это просто проходит через getDefenseMethod и это перемещает спрайт между этими тремя местами, но это странное поведение, у меня есть два звонка перед первым getDefenseMethod и один после того, как спрайт прыгает вокруг от центра экрана, затем возвращается к новой точке spawnPoint:

2013-03-04 20:08:14.897 10-8[2629:c07] before: {217.533, 177.32}
2013-03-04 20:08:14.898 10-8[2629:c07] spawnPoint 1
2013-03-04 20:08:14.899 10-8[2629:c07] after: {100, 100}

не понимаю, почему он это делает. Почему он не просто начинается с позиции, в которой он был?

- (void)execute:(GangMembers *)player {

    // Check if should change state
    NSArray * enemies = [player.layer enemiesOutsideRange:75 ofPlayer:player];
    if (enemies.count > 0) {
        NSLog(@"outside range 75");
        [player changeState:[[Attacking alloc] init]];
        return;
    }

    [player.layer setPlayer:player attacking:NO];

    // Make build decision
    [player.layer unschedule:@selector(shoot:)];

    [player pauseSchedulerAndActions];
    NSLog(@"before: %@", NSStringFromCGPoint(player.position));
    [self getDefensePosition];
    player.position = spawnPoint;
     NSLog(@"after: %@", NSStringFromCGPoint(player.position));
    [player performSelector:@selector(resumeSchedulerAndActions) withObject:player afterDelay:2];

}

- (void)getDefensePosition {
    // CGSize winSize = [CCDirector sharedDirector].winSize;
    int spawnChoice = arc4random() % 3;
    spawnPoint = ccp(100, 100);

    if(spawnChoice == 0){
        spawnPoint = ccp(100, 100);
        NSLog(@"spawnPoint 1");
    }
    else if(spawnChoice == 1){
        spawnPoint = ccp(100, 200);
        NSLog(@"spawnPoint 2");
    }
    else {
        spawnPoint = ccp(100, 300);
        NSLog(@"spawnPoint 3");
    }


}

1 ответ

Решение

FWIW, я подозреваю, что ваш объект игрока имеет некоторый тип действий CCMove (который вы приостанавливаете). Даже если вы изменяете позицию во время паузы, когда действие возобновляется, действие устанавливает позицию в ее текущее состояние (startPosition, endPosition, продолжительность, время, прошедшее с начала), которое может сильно отличаться от позиции, которую вы установили во время паузы.

не уверен в вашей объектной модели / структуре класса, но что-то вроде этого:

    [player stopAllActions];
    player.position = spawnPoint;
    [player runAction: [CCSequence actions:
        [CCDelayTime actionWithDuration:2.0],
        [CCMoveTo actionWithDuration:arc4random()%5+1 position: randomPoint], 
         [CCCallBlock actionWithBlock:^{ [self performSelector:@selector(moveRandom:) withObject:s afterDelay:0.5]; }], 
        nil]
    ];

таким образом, вы воссоздаете действие moveto, которое будет выполнено из spawnPoint, и ваш player.position не вступает в конфликт с запущенным действием. Написано по памяти, у вас пробег может отличаться:)

Другие вопросы по тегам