Вопрос

I am making a platformer game in C++ using SFML and Box2D libraries. The player has a pistol, I'm trying to implement shooting.

Box2D has a RayCast function, which needs two positions to check for intersections between. I have the player position and the mouse position. Currently the line checks between those two, not ideal.

I need a third position, which is the position, where the pistol shot would end. The distance between the player position and the third position should always be 1000.

Это было полезно?

Решение

The maths are pretty simple. Consider the following line, A and B being your known points (A is the origin of the segment, ie. your player) and C being the third point you're looking for:

   A-----------B------------C
(Xa,Ya)     (Xb,Yb)      (Xc,Yc)

Now the distances:

AB = sqrt( (Xb - Xa)² + (Yb - Ya)² )
AC = 1000

Cross-multiply to get Xc:

AB -> Xb - Xa
AC -> Xc - Xa

Xc - Xa = AC * (Xb - Xa) / AB
Xc = Xa + (AC * (Xb - Xa) / AB)

Similarly, Yc = Ya + (AC * (Yb - Ya) / AB)

Note that this also works if C is between A and B, the only (obvious) restriction is if A and B are the same point (AB = 0, conveys no direction information and rightly yields a division by zero).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top