Search code examples
objective-ccocos2d-iphonegame-physics

CCMoveTo duration / speed issue


Some help would be most appreciated. Sprite movement based upon a heading that is given from a touch on the screen. Sprite moves as expected but I am unable to vary the speed, no matter what value I use for currentSpeed. This is in the update method of the sprite. Thanks in advance.

    // Distance between two points (Distance formula, Pythagorean Theorem c^2=a^2+b^2, so d=sqrt((x2-x1)^2+(y2-y1)^2)
    // Duration (time = distance / rate)

    CGPoint adjustedPosition;
    adjustedPosition.x = position_.x - sinf(heading);
    adjustedPosition.y = position_.y - cosf(heading);

    float distance = CGPointDistanceBetweenTwoPoints(adjustedPosition, position_);
    float duration = distance / currentSpeed;

    position_ = adjustedPosition;

    [self runAction:[CCMoveTo actionWithDuration:duration position:position_]];

Solution

  • dont use a moveto or for that matter any action in an update method. Instead, compute the position , something like this:

    -(void) update:(ccTime) dt {
    
        // _velocity in points per second.
        // heading should be in ccw notation, 0 on x axis, RHS
    
        float deltaX = dt * _velocity * cosf(heading);
        float deltaY = dt * _velocity * sinf(heading);
        CGPoint adjustedPosition = ccpAdd(self.position, ccp(deltaX,deltaY));
        self.position = adjustedPosition;
    }
    

    or something similar. This will ease out any variance id dt, for which the only thing you can bet on is that it wont be constant ; but the physics should be right.