我正在使用SFML和Box2D库在C ++中制作平台游戏。 玩家有一把手枪,我正在尝试实施射击。
Box2D具有RayCast功能,需要两个位置来检查两者之间的交叉点。 我有玩家位置和鼠标位置。目前这两行之间的线路检查并不理想。
我需要第三个位置,即手枪射击结束的位置。 玩家位置和第三个位置之间的距离应始终为1000。
答案 0 :(得分:4)
数学非常简单。考虑以下几行,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
,则不传达方向信息并且正确地产生除零值)