我一直在研究2D游戏,有点像Terraria,我已经到了准备进行碰撞检测的阶段。我自己尝试过,但它......很奇怪。我想知道是否有人可以帮助我。我将所有块存储在2D数组中:
Block[][] map = new Block[mw][mh];
其中mw
是地图宽度,mh
是地图高度(以块数表示)。每个Block
是一个显示为16x16像素的图像。这是我尝试的,我知道这是错的,但我真的不知道我需要做什么。
private void checkCollision() {
for(int x = -1; x <= 1; x++){
for(int y = -1; y <= 2; y++){
Rectangle obj = new Rectangle((int)Block.getXOnScreen(xblock+x), (int)Block.getYOnScreen(yblock+y), 16, 16);
try{
if(main.map[(int) (xblock+x)][(int) (yblock+y)].solid && obj.intersects(bounds()){
if(y <= -1 && velY > 0){
velY = 0;
System.out.println("Collision below");
onground = true;
}else if(y >= 2 && velY < 0){
velY = 0;
System.out.println("Collision above");
}
if(x <= -1 && velX < 0){
velX = 0;
System.out.println("Collision left");
}else if(x >= 1 && velX > 0){
velX = 0;
System.out.println("Collision right");
}
}
}catch(Exception e){}
}
}
}
我将这种方法称为每次滴答,但它不会与任何东西发生冲突,因此玩家就会摔倒。
public void tick(){
xblock += velX;
yblock += velY;
velY += gravity;
checkCollision();
}
如果有人知道如何有效地进行碰撞检测,请与我分享。谢谢! :)
答案 0 :(得分:-1)
基于我曾经写过的少数JavaFX / Swing应用程序,您想要检测碰撞的方式是始终跟踪对象的位置,以及何时移动检查以查看它是新位置(旧+运动)数量)不超过地图的限制。如果是这样,您希望将其位置重置为限制,以便它可以进入所有其他有效的方向。如果你继续试图超出极限,那么它应该继续重置你的位置。
所以说页面的限制是500像素宽,你在495位置,每次移动都是10,下次移动时你将位于505位置,这样就明显超出了范围。因此,您运行检查if(currentPosition&gt; limit){reset position to limit}因此您的currentPosition将设置为500,它位于边界上且在限制范围内。