碰撞工作除了从右边来的时候

我正在尝试做一个炸弹人克隆。 我在墙上碰撞的问题不在地图的两侧(见图)。 当我从右边(左边)来的时候,红色方块(球员)穿过墙壁,但是当我从另一边(上,左,下)来时,碰撞效果很好,球员不能穿过。 即使我从右边走向左边,侧墙的碰撞也很好。 在这里输入图像说明

我正在使用Tiled和LibGDX,这里是代码:

private void checkCollision(float delta) { //player.getVelocity().scl(delta); Vector2 position = player.getPosition(); // just to see if it overlaps because this is the location of the // rectangle when getTiles is called when player moves left as shown in the image Rectangle rect = new Rectangle(128, 128, 64, 64); if(player.getRectangle().overlaps(rect)) { System.err.println("overlap"); } if(player.isMovingRight()) { Array<Rectangle> tiles = getTiles((int)(position.x/TILE_SIZE + 1), (int)(position.y/TILE_SIZE - 1), (int)(position.x/TILE_SIZE + 1), (int)(position.y/TILE_SIZE + 1)); for (Rectangle tile : tiles) { if(player.getRectangle().overlaps(tile)) { System.out.println("overlap right"); player.setPosition(tile.x - player.getWidth() , player.getPosition().y); } } } if(player.isMovingLeft()) { Array<Rectangle> tiles = getTiles((int)(position.x/TILE_SIZE - 1), (int)(position.y/TILE_SIZE - 1), (int)(position.x/TILE_SIZE - 1), (int)(position.y/TILE_SIZE + 1)); for (Rectangle tile : tiles) { if(player.getRectangle().overlaps(tile)) { System.out.println("overlap left"); // this doesn't show player.setPosition(tile.x + tile.width, player.getPosition().y); } } } if(player.isMovingUp()) { Array<Rectangle> tiles = getTiles((int)(position.x/TILE_SIZE - 1), (int)(position.y/TILE_SIZE - 1), (int)(position.x/TILE_SIZE + 1), (int)(position.y/TILE_SIZE)); for (Rectangle tile : tiles) { if(player.getRectangle().overlaps(tile)) { System.out.println("overlap up"); player.setPosition(player.getPosition().x, tile.y + tile.height); } } } if(player.isMovingDown()) { Array<Rectangle> tiles = getTiles((int)(position.x/TILE_SIZE - 1), (int)(position.y/TILE_SIZE + 1), (int)(position.x/TILE_SIZE + 1), (int)(position.y/TILE_SIZE + 1)); for (Rectangle tile : tiles) { if(player.getRectangle().overlaps(tile)) { System.out.println("overlap down"); player.setPosition(player.getPosition().x, tile.y - player.getHeight()); } } } //player.getVelocity().scl(1/delta); } private Array<Rectangle> getTiles(int startX, int startY, int endX, int endY) { TiledMapTileLayer layer = (TiledMapTileLayer)level.getMap().getLayers().get(1); Array<Rectangle> rectangles = new Array<Rectangle>(); for (int x = startX; x <= endX; x++) { for (int y = startY; y <= endY; y++) { Cell cell = layer.getCell(x, y); if(cell != null) { Rectangle rect = new Rectangle(x*TILE_SIZE, y*TILE_SIZE, TILE_SIZE, TILE_SIZE); rectangles.add(rect); } } } return rectangles; } 

毛病在你的isMovingLeft方法。 你在getTiles中给出了startend相同的X值。 这就是为什么它没有创建几何区域。

因此,在player.isMovingLeft()检查player.isMovingLeft()第三个参数从(int)(position.x/TILE_SIZE - 1)(int)(position.x/TILE_SIZE + 1)

由此它将创建您的瓷砖大小的一个区域。

  1. 检查是否有碰撞。
  2. 找出碰撞的方向。
  3. 将玩家移到对面。

忘记检查玩家正在移动的方向。 摆脱if(player.isMovingLeft())等。

发现碰撞后,比较瓦片和玩家的位置以找出碰撞的方向。 然后向另一个方向移动玩家。 如果您正在使用speed*timeElapsed正常移动播放器,则从碰撞中向另一个方向移动时再次使用它。

为了find碰撞的方向:

 if (player.width/2 + tile.width/2 < Math.abs(player.x - tile.x)) { // collsion from left or right if (player.x > tile.x) { player.setPosition(tile.x + player.width/2 + tile.width/2, player.y) } else { player.setPosition(tile.x - player.width/2 - tile.width/2, player.y) } } 

你可以用这个来查找是否有碰撞。

注:始终将玩家移到另一侧或重新定位对方,请勿阻止移动。