2014-09-29 65 views
-1

我正在构建一个基于2d瓦的游戏,类似于塞尔达传说游戏,而我的碰撞方法无法正常工作。当玩家远远低于不可通行的瓦片时,该方法将返回碰撞。必须有一个我在这里没有看到的逻辑错误。这是用Java编写的。碰撞法疯了;

从静态碰撞类:

public static boolean collisionAbovePlayer(TileGrid grid, float x, float y, int width, int height) { 
    boolean collision = false; 

    for (Tile[] row : grid.map) { 
     for (Tile t : row) { 

      // Each Tile t in map: 

      if (t.getType().getPassable() == false) { 

       // Each impassable tile: 

       if ( (x-t.getX() > 0 && x - t.getX() < t.getWidth()) || (x - t.getX() < 0 && Math.abs(x - t.getX()) < width)) { 

        // Tile is within collision x range 

        if ((t.getY() + t.getHeight() + 1) - y < Math.abs(5)) { 
         collision = true; 
        } else { 
         collision = false; 
        } 

       } else { 
        collision = false; 
       } 
      } 
     } 
    } 

    return collision; 
} 

这是我Player类被称为用这种方法(我还没有实现对其他方向的碰撞方法还):

public void Update() { 
    if (first) 
     first = false; 
    else { 
     if ((Keyboard.isKeyDown(Keyboard.KEY_W)) && (!collisionAbovePlayer(grid, x, y, width, height))) { 
      y -= Delta() * speed; 
     } 
     if (Keyboard.isKeyDown(Keyboard.KEY_A)) { 
      x -= Delta() * speed; 
     } 
     if (Keyboard.isKeyDown(Keyboard.KEY_S)) { 
      y += Delta() * speed; 
     } 
     if (Keyboard.isKeyDown(Keyboard.KEY_D)) { 
      x += Delta() * speed; 
     } 
    } 
} 

设我知道你是否需要查看更多的代码,谢谢你的时间。

+1

你在调试器中通过了这段代码吗? – 2014-09-29 20:36:44

+2

只是三个小的注释:'if(t.getType()。getPassable()== false)'用这个代替'if(!t.getType()。getPassable())'。 'Math.abs(5)'...和'5'不一样吗?最后一个:不要这样做:'collision = true;'。您正在检测碰撞并将其保存到变量中。然后你继续迭代你的循环,如果其他的tile不与玩家碰撞,变量'collision'将被'false'覆盖。如果你检测到一个碰撞,那么'返回true;'而不是。 – Tom 2014-09-29 20:43:17

+0

是的,我不记得我在'Math.abs(5)'中做了什么,但是我原来的设置为1,所以如果不能通过的瓦片是上面的一个像素,它会返回true,但我担心玩家如果'Delta()'太高,精灵可能会跳过它。 – 2014-09-30 01:38:46

回答

1

修正:

public static boolean collisionAbovePlayer(TileGrid grid, float x, float y, int width, int height) { 

    for (Tile[] row : grid.map) { 
     for (Tile t : row) { 

      // Each Tile t in map: 

      if (!t.getType().getPassable()) { 

       // Each impassable tile: 

       if ((x - t.getX() > 0 && x - t.getX() < t.getWidth()) || (x - t.getX() < 0 && Math.abs(x - t.getX()) < width)) { 

        // Tile is within collision x range 

        System.out.println("IN X RANGE"); 

        if (Math.abs((t.getY() + t.getHeight() + 1) - y) < 2) { 
         return true; 
        } 

       } 
      } 
     } 
    } 

    return false; 
} 

在原来的代码仅返回的最后一张牌是设置“布尔碰撞”为真,和最后陈述检查y必需Math.abs()周围的第一个值。