Pavle37
Pavle37

Reputation: 581

Better gaming physics for bullet trajectory

I am creating a game which involves shooting in the direction where user clicked.

So from point A(x,y) to point B(x1,y1) i want the bullet bitmap to animate and i have done some calculation/math and figured out some way to do it, but it's not that great-looking doesn't feel so natural.

My approach to doing this is calculate the difference between x and x1 and y and y1 and just scale it.

In example if the X difference between x and x1 is 100 and Y difference between y and y1 i calculate X/Y and get 2.0 which is equal to 2:1 so I know that I should move X two times faster than Y.

Here is my code, if anyone has any suggestions how to make it better, let me know.

float proportion;
float diffX = (x1 - x);

if(diffX == 0) diffX = 0.00001f;

float diffY = (y1 - y);
if(diffY == 0) diffY = 0.00001f;

if(Math.abs(diffX)>Math.abs(diffY)){
    proportion = Math.abs(diffX)/Math.abs(diffY);
    speedY = 2;
    speedX = proportion * speedY;
}
else if(Math.abs(diffX)<Math.abs(diffY)){
    proportion = Math.abs(diffY)/Math.abs(diffX);
    speedX = 2;
    speedY = proportion * speedX;
}
else{
    speedX = speedY = 2;
}

if(diffY<0) speedY = -speedY;
if(diffX<0) speedX = -speedX;
if(speedX>=10) speedX = 9;
if(speedX<=-10) speedX = -9;
if(speedY>=10) speedY = 9;
if(speedY<=-10) speedY = -10;

Upvotes: 0

Views: 283

Answers (2)

Exceptyon
Exceptyon

Reputation: 1582

The following implements LERP (linear interpolation) to move you along a straight line.

// move from (x1, y1) to (x2,y2) with speed "speed" (that must be positive)
final double deltay = y2-y1;
final double deltax = x2-x1;

double deltalen = sqrt(deltay*deltay + deltax*deltax);
if (deltalen <= speed)
    display(x2, y2);
else {
    double finalx = x1 + deltax * speed/deltalen; // surely deltalen > 0, since speed >=0
    double finaly = y1 + deltay * speed/deltalen;

    display(finalx, finaly);
}

Upvotes: 1

rashmatash
rashmatash

Reputation: 1819

Here is the code to elaborate on my comment:

float slope = (x2 -x1)/(y2 - y1);
float dx = 0.1f; // tweake to set bullet's speed
float x = x1;    
while(x < x2)
{
    float y = slope*(x - x1) + y1;        
    DisplayBullet(x, y);
    x += dx;
}
// at this point x = x2 and, if everything went right, y = y2

Here I'm assuming that x1 < x2. You'll have to swap points when that's not the case.

Upvotes: 0

Related Questions