CCMoveTo не получает обновленную запись игрока ..... (iphone, cocos2d) - PullRequest
1 голос
/ 10 апреля 2011

Я добавляю врага вот так:

-(void)addEnemy {
    if ([spawnedEnemies count] < 25) {
        CCSprite* sprite = [CCSprite spriteWithFile:@"white.png"];
        float randomX = arc4random() % 480;
        float randomY = arc4random() % 320;

        sprite.position = ccp(randomX,randomY);
        [spawnedEnemies addObject:sprite];
        [self addChild:sprite];  

        [sprite runAction:[CCMoveTo actionWithDuration:5 position:player.position]];
    } }

но если мой игрок перемещается, спрайт все еще перемещается в последнюю позицию игрока ... из-за этого я попробовал это в своем тике:

- (void) галочка: (ccTime) дельта {

for (CCSprite *sp in spawnedEnemies) {
    [sp stopAllActions];
    [sp runAction:[CCMoveTo actionWithDuration:5

позиция: player.position]]; }}

но враги будут двигаться, только если я перестану двигаться (там просто движется reallllllllyyyyyyyyy slow, потому что каждый раз, когда я двигаюсь, он вызывает [sp stopAllActions]

Что мне теперь делать?

EDIT: * EDIT: * EDIT: * EDIT: * EDIT: * EDIT: * EDIT: * EDIT: * EDIT: Теперь я делаю это, и враги движутся к игроку, даже если игрок движется но есть проблема: чем ближе враг (к игроку), тем медленнее они двигаются ... Как это решить?

//function to apply a velocity to a position with delta
static CGPoint applyVelocity(CGPoint velocity, CGPoint position, float delta){
    return CGPointMake(position.x + velocity.x * delta, position.y + velocity.y * delta);
}


-(void)tick:(ccTime)delta {    
    for (CCSprite *sp in spawnedEnemies) {
        CGPoint m = ccpSub(player.position, sp.position);
        sp.position = applyVelocity(m, sp.position, 1.0/60.0f);
    }
}

1 Ответ

4 голосов
/ 10 апреля 2011

У меня есть четыре идеи:

  1. Запланируйте новый селектор обновлений с более низкой частотой и переместите врагов в этом методе: [self schedule:@selector(moveEnemies) interval:0.1];

  2. Перемещайте врагов только тогда, когда изменяется положение игрока, возможно, в вашем ccTouchesMoved -методе.

  3. Вместо использования CCActions, установите положение спрайта напрямую, вам нужновыполните некоторые векторные вычисления.

  4. Используйте физический движок, такой как Box2D (входит в Cocos2D SDK).Затем вы можете просто применить силу к каждому врагу в направлении игрока на каждом шаге.

РЕДАКТИРОВАТЬ: Для перемещениявраги с постоянной скоростью нормализуют вектор скорости m:

m = ccpMult(ccpNormalize(m), kSpeed);

kSpeed ​​- это постоянное значение с плавающей точкой для регулировки скорости.

Надеюсь, что это поможет ...

...