我对游戏编程很新,并且已经采取了一些示例,我正在尝试做一些我需要一些简单的矢量物理帮助的东西。我有一个球在一个方向上以一个固定的速度穿过屏幕,用一个矢量表示。我想触摸其他地方的屏幕并让球改变方向,朝着我触摸屏幕的方向以同样的速度前进。我能够轻松改变方向,但速度会根据我从当前位置按下的距离而改变。我一直试图做一些规范化等,没有成功。
这是现有的代码,但是在渲染时会使球改变速度。希望这是足够的信息。非常感谢!!
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);
答案 0 :(得分:4)
我能够轻松改变方向但速度会根据改变而改变 我从当前位置按下的距离。我一直在努力 做一些规范化等,没有成功。
我倾向于说你可能已经将规范化部分弄错了,因为这应该是你问题的答案。你的代码确实改变了速度,因为当前位置和触摸位置之间的差异被缩小了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值,但由于截断,您将失去该过程的准确性。根据比例因子,触摸屏幕后,这可能会或可能不会导致显着的速度不同。