2011-04-23 130 views
1

我正在制作一款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; 
    } 

但是,它是作用很古怪,它的变化速度,当我从一个侧面去,等

+0

[环线冲突检测(http://stackoverflow.com/questions/1073336/circle-line-collision-detection) – schnaader 2011-04-23 12:25:33

+0

更多关于这个答案可能重复,也许? – Stan 2011-04-25 00:10:02

回答

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; 
+0

嗯,我还不是一个好的编码器,我真的不明白这一点。这真的很难吗?或者? – Stan 2011-04-23 12:38:30

+0

最难的是涉及的数学。在这种情况下,我建议你应该从答案中复制/粘贴代码并将其扩展,以便它适用于你。我会编辑我的答案,并留下一些其他意见。 – schnaader 2011-04-23 12:46:23

+0

好吧,如果我将椭圆形编辑成长方形,会更容易吗,还是会一样? – Stan 2011-04-23 12:48:57

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; 
} 
+0

它仍然会通过所有的对象,不知何故。 – Stan 2011-04-25 11:38:32