我是游戏编程的新手,我取了一个样本,正在尝试做一些我需要一些简单的向量物理帮助的事情。我有一个球,在一个方向上,以一个固定的速度穿过屏幕,这个速度由一个矢量表示。我想在其他地方触摸屏幕,让球改变方向,以与屏幕相同的速度飞向我触摸屏幕的地方。我可以很容易地改变方向,但速度是根据我从当前位置按下的距离而改变的。我一直在尝试做一些标准化,等等,但没有成功。
下面是现有的代码,它可以正常工作,但会导致球在渲染时改变速度。希望这是足够的信息。非常感谢!
coord = graphic.getCoordinates();
speed = graphic.getSpeed();
// x and y are the newly touched coordinates and
// getTouchedX and getTouchedY are the current coordinates
int diffX = x - coord.getTouchedX();
int diffY = y - coord.getTouchedY();
int amplitude = diffX / 10;
graphic.getSpeed().setX(amplitude);
amplitude = diffY / 10;
graphic.getSpeed().setY(amplitude);
发布于 2012-02-13 07:35:13
我可以很容易地改变方向,但是速度是根据我从当前位置按下的距离而改变的。我一直在尝试做一些标准化,等等,但没有成功。
我倾向于说你可能把正规化部分搞错了,因为这应该是你问题的答案。你的代码确实改变了速度,因为当前位置和触球位置之间的差异只是缩小了10倍。这意味着触球相对于当前位置的距离会影响速度:触球距离越远,球的移动速度就越快。
为了防止这种情况发生,请对x和y分量进行归一化,以获得单位向量。它的特点是它的幅度/长度(基本上是速度)恰好是'1‘。你可以考虑它,指出垂直和水平分量在总速度中所占的百分比。
int diffX = x - coord.getTouchedX();
int diffY = y - coord.getTouchedY();
double magnitude = Math.sqrt(diffX*diffX + diffY*diffY);
double amplitude = (double)diffX / magnitude;
graphic.getSpeed().setX(amplitude);
amplitude = (double)diffY / magnitude;
graphic.getSpeed().setY(amplitude);
请注意,我将振幅更改为double
,因为在此处使用int值将导致分量被截断为'0‘或'1’(因为向量的大小总是大于或等于其单个分量)。因此,您可能希望应用比例因子来获得可行的int值,尽管在此过程中会因为截断而失去准确性。根据缩放系数的不同,这可能会也可能不会在触摸屏幕后导致显著的速度差异。
https://stackoverflow.com/questions/9256592
复制相似问题