一个人如何才能正确地移动到对角线碰撞箱中进行对角线移动?

How can one have right movement into diagonal collision boxes giving diagonal movement?

首先,对于长标题表示歉意;我想不出一种方法来充分解决我的问题,同时进一步压缩它。

我正在 Java 中创建一个 2D 游戏,屏幕中央有一个角色。我的角色有一个碰撞盒,我在地图上有图像(从上面看)也有碰撞盒。 但是,如果碰撞发生在与我的方向不垂直的一侧,我希望能够遇到 "slide" 情况。

例如,如果我的角色向东移动,他的东边有一堵墙从西南到东北方向,而不是仅仅注意到东边有一个 object 并且没有移动,我希望我的角色能够 "slide" 沿着墙向东北移动以实现向东移动的尝试。

有什么简单的方法可以做到这一点吗?

如果有任何帮助,我正在使用 Java Slick2D,并将角色的碰撞框设置为他站立的矩形,将其他 object 的碰撞框设置为多边形。

提前感谢您的任何回复!

Class java.awt.geom.Area 有一个方法 intersects( Area a ) 应该对确定影响的 "point" 有用,称之为 P.如果角色的碰撞框是一个矩形并且障碍物被任意多边形包围,你将不得不确定

  1. 参与碰撞的矩形点或边
  2. 参与碰撞的多边形的点或边

如果边与边相交(应该是平行的),则角色不能再沿当前方向移动;不应发生滑动。同样,如果矩形边遇到多边形点,则移动被阻止。

如果一个点与一个点相交,您可以通过(任意?)select 多边形的其中一条边来解决这个问题,并据此处理这种情况。

最后,如果矩形角遇到斜边,则必须分析该边的几何形状。 (验证如果向北或向东(南或西)右上角(左下角)会遇到 10 比 4 的边,或者左上角(右下角)会遇到 7 比 1 的边) 向北或向西(向南或向东)时的手角)。然后你可以确定沿斜边的强制路径​​。

虽然这听起来相对简单,但如果对象(多边形)的碰撞框可能具有凹面部分,那么可能会出现更复杂的情况。

当您解决了识别何时发生碰撞的问题后,可以通过计算垂直于墙壁的运动分量并从运动矢量中减去该分量来实现滑动运动。 假设你有一个运动向量 v = (v_x, v_y) 和墙的法线 n = (n_x,n_y)。法向量的长度应为 1。 那么你的新运动矢量应该是 v_new = v - (v * n) * n。 X 和 Y 分别是 v_new_x = v_x - (v_x * n_x + v_y * n_y) * n_y, 和 Y

一样