我正在制作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 :(得分: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;
}