我正在使用 SFML 和 Box2D 库在 C++ 中制作平台游戏。玩家有手枪,我正在尝试实施射击。
Box2D 有一个 RayCast 函数,它需要两个位置来检查它们之间的交叉点。我有玩家位置和鼠标位置。目前这两者之间的线路检查并不理想。
我需要第三个位置,也就是手枪射击结束的位置。玩家位置和第三位置之间的距离应始终为 1000。
数学很简单。考虑以下行,A 和 B 是您的已知点(A 是该段的原点,即您的播放器),C 是您要查找的第三个点:
A-----------B------------C
(Xa,Ya) (Xb,Yb) (Xc,Yc)
现在距离:
AB = sqrt( (Xb - Xa)² + (Yb - Ya)² )
AC = 1000
交叉乘以得到 Xc:
AB -> Xb - Xa
AC -> Xc - Xa
Xc - Xa = AC * (Xb - Xa) / AB
Xc = Xa + (AC * (Xb - Xa) / AB)
相似地,Yc = Ya + (AC * (Yb - Ya) / AB)
请注意,如果 C 在 A 和 B 之间,这也有效,唯一(明显)的限制是如果 A 和 B 是同一点(AB = 0
,不传达方向信息并且正确地产生除以零)。