对象的碰撞系统?

时间:2011-04-23 12:24:10

标签: java collision

我正在制作2D游戏,我有一个玩家。

编辑:

这就是我现在所拥有的:

        int oldX = player.x;
    int oldY = player.y;

    int newX = oldX - player.getSpeedX();
    int newY = oldY - player.getSpeedY();

    if(player.getBounds().intersects(brush1.getBounds())){
        player.x = newX;
        player.y = newY;
    }else{
        player.x = oldX;
        player.y = oldY;
    }

但是,它表现得非常奇怪,当我从一边进入时会改变速度等等。

2 个答案:

答案 0 :(得分:1)

对于检查线段和圆的交点的公式和代码,请查看此SO answer

其余代码应该非常清楚,在你移动之前,检查是否发生碰撞,如果发生碰撞,不要移动。

根据您喜欢的行为,您也可以尽可能靠近墙壁移动,然后平行移动以让圆圈沿墙壁“滑动”。这可以通过将运动矢量投影到与墙壁方向相同的直线上来完成。

编辑:关于如何使用答案中的代码检查冲突的一些评论:

代码使用Dot函数来计算两个向量的dot product。您可以创建一个Vector类(一个很好的练习,它对这些项目很有用)或直接使用formulas here计算点积。

向量类将使一些代码更易于阅读,但您也可以直接对浮点数进行操作。例如,让我们看一下d(光线方向矢量)和f(从中心球到光线开始的矢量)的计算,如答案开头所述。使用矢量类,这将与在那里使用的公式一样简单:

// L, E, C, d and f are of some vector type
d = L - E;
f = E - C;

如果没有矢量类,你将为所有变量分别设置x / y坐标,使代码膨胀一点但做同样的事情:

// Twice as much variables, but all of them are usual floats.
dx = Lx - Ex;
dy = Ly - Ey;
fx = Ex - Cx;
fy = Ey - Cy;

答案 1 :(得分:0)

我认为您的代码段有一些错误。建议修复:

int oldX = player.x;
int oldY = player.y;

// *add* speed to old pos to get new pos
int newX = oldX + player.getSpeedX();
int newY = oldY + player.getSpeedY();

if(player.getBounds().intersects(brush1.getBounds())){
    // Collision!  Keep old position.
    // Reverse speed (just a suggestion).
    player.setSpeedX(-player.getSpeedX());
    player.setSpeedY(-player.getSpeedY());
}else{
    // No collision.  Set position to *new* pos, not old pos.
    player.x = newX;
    player.y = newY;
}