cocos2dbeginner
cocos2dbeginner

Reputation: 2207

CCMoveTo doesn't get the updated player postition.....(iphone,cocos2d)

I'm adding an enemy like this:

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

but if my player moves the sprite still moves to the last player position... because of that i tried this in my tick:

-(void)tick:(ccTime)delta {

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

position:player.position]]; } }

but the enemies will only move if i stop moving (there just moving reallllllllyyyyyyyyy slow because every time i move it calls [sp stopAllActions]

What should I do now?

EDIT:*EDIT:*EDIT:*EDIT:*EDIT:*EDIT:*EDIT:*EDIT:*EDIT: Now I'm doing this and the enemies are moving to the player even if the player is moving but there's a problem: the nearer the enemy (is to the player) the slower they are moving... How to solve this?

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

Upvotes: 1

Views: 1016

Answers (1)

Felix
Felix

Reputation: 35384

I have four ideas:

  1. Schedule a new update selector with a lower frequency and move the enemies in that method: [self schedule:@selector(moveEnemies) interval:0.1];

  2. Only move the enemies when the player.position changes, maybe in your ccTouchesMoved-method.

  3. Instead of using CCActions, set the position of the sprite directly, you need to do some vector-computations.

  4. Use a physics-engine like Box2D (included in Cocos2D SDK). Then you can simply apply a force to each enemy to the direction of the player in each step.

EDIT: In order to move the enemies with constant velocity, normalize the velocity vector m:

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

kSpeed is a constant float value to adjust the speed.

Hope that helps...

Upvotes: 4

Related Questions