nounoursnoir
nounoursnoir

Reputation: 703

Giving a direction to a moving object

I wish to create a tower defense game in SDL. Before starting the project, I experiment everything I will need to do when programming the game. In the test I am doing currently, there are a tower (static object), targets (moving objects) that are in its range, and shoots (moving objects) that are fired from the turret to the targets. What I fail to do is find a way to give the 'shoot' objects a direction. By shoot object, I mean the object that is fired by the tower when targets are in range. Also, whatever the direction is, the shoot shall always have the same speed, which forbids the use of the formula dirx = x2 - x1.

Shoots are structures defined as the following:

typedef struct shoot
{
    SDL_Surface *img; // Visual representation of the shoot object.
    SDL_Rect pos;     // Position of the object, it's a structure containing
                      // coordinates x and y (these are of type int).
    int index;
    float dirx;       // dirx and diry are the movement done by the shoots object in
                      // 1 frame, so that for each frame, the object shoot is moved dirx
                      // pixels on the axis x and diry pixels on the axis y
    float diry;       // (the program deals with the fact that the movement will be done
                      // with integers and not with floats, that is no problem to me)
    float posx;       // posx and posy are the real, precise coordinates of the shoot
    float posy;
    struct shoot *prev;
    struct shoot *next;
} shoot;

What I need is a way to calculate the position of the object shoot in the next frame, given its position and direction in the current frame.

This is the best I could find (please note that it is a paper written formula, so the names are simplified, different from the names in the code):

The problem with this formula is that it gives me an unexact value. For example, aiming in diagonal will make the shoot slower that aiming straight north. Moreover, it doesn't go in the right direction, and I can't find why since my paper tests show me I'm right...

I would love some help here to find a formula that makes the shoot move correctly.

Upvotes: 0

Views: 159

Answers (1)

meowgoesthedog
meowgoesthedog

Reputation: 15035

If p1 is the source of a shoot object, p2 is the destination, and s is the speed you want to move it at (units per frame or per second - latter is better), then the velocity of the object is given by

float dx = p2.x - p1.x, dy = p2.y - p1.y,
      inv = s / sqrt(dx * dx + dy * dy);
velx = inv * dx; vely = inv * dy;

(You should probably change dir to vel as it is a more sensible variable name)


Your attempt seems to be normalizing the direction vector by Manhattan distance, which is wrong - you must normalize by the Euclidean distance, which is given by the sqrt term.

Upvotes: 6

Related Questions