2013-01-07 76 views
1

我在自上而下的游戏中实现了一个简单的基于瓦片的碰撞系统,但是我在移动角落时遇到了问题。目前,我的程序需要玩家的中心点,并在20px的正方形网格(交替的灰色cbackground)上绘制一个图块。它检查上下左右瓷砖是否发生碰撞,如果发现其中一个,就会移动到下一个阶段。基于图块的碰撞;角点碰撞问题

下一个阶段是检查玩家为瓦片内。为此,我有一个名为getCenterDistanceFromCurrentTile()(我知道的创意名称)的功能。这将返回从瓦片中心点到玩家中心点距离的Vector2i(x和y)。然后我用下面的方法来使用它。

  • 如果有一个壁砖的左侧,和玩家的距离x < 0(玩家的当前瓦片的中心点的左侧),玩家移动到瓦片的x旁壁。
  • 如果有一个壁到右边,和玩家的距离x为> 0(当前瓦片的中心点的右侧),玩家被移动到旁边的墙上的瓷砖的x。
  • 这对于Y轴以相同的方式继续。

我的问题是对角线。我目前不检查对角线碰撞,但看起来我不得不这样做。我已经试图实现它,但玩家在角落时跳来跳去。我一起使用了上述玩家x < 0和玩家y < 0的方法,这些方法都没有解决。我已经做了一些图像来更好地解释我的问题。

Problem image 1

此图片展示了我的碰撞系统工作正常,与碰撞到左侧(用蓝色瓷砖所示),并正在检查的粉红色的瓷砖,但没有发现碰撞。绿色图块显示玩家当前的图块,红色图块显示玩家的当前位置。

Problem image 2

该图像清楚地显示我的问题。粉红色的瓷砖没有与任何物体相撞,因此玩家的x和y不需要检查。

我应该如何在我的游戏检查角落碰撞?

我目前的碰撞检测代码;

public boolean isWall(Vector2i loc) 
{ 
    return this.isWall(loc.x, loc.y); 
} 

public boolean isWall(int x, int y) 
{ 
    if (x < 0) return true; 
    if (y < 0) return true; 
    if (y > map[0].length-1) return true; 
    if (x > map.length-1) return true; 
    return map[x][y]; 
} 

public void phys(Player plr) { 
    Vector2i playerTile = plr.getTile(); 
    // Left 
    if (isWall(playerTile.x-1, playerTile.y)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.x < 0) 
     { 
      plr.setX(playerTile.x*BLOCK_SIZE); 
     } 
    } 
    // Right 
    if (isWall(playerTile.x+1, playerTile.y)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.x > 0) 
     { 
      plr.setX(playerTile.x*BLOCK_SIZE); 
     } 
    } 
    // Up 
    if (isWall(playerTile.x, playerTile.y-1)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.y < 0) 
     { 
      plr.setY(playerTile.y*BLOCK_SIZE); 
     } 
    } 
    // Down 
    if (isWall(playerTile.x, playerTile.y+1)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.y > 0) 
     { 
      plr.setY(playerTile.y*BLOCK_SIZE); 
     } 
    } 
} 

回答

1

根据玩家是否与任何墙壁碰撞,您的物理方法可以返回布尔值。然后,您可以使用此功能的结果来决定是否移回到您移动之前的空间中的先前位置,或者如果您未碰撞,则继续。

这就需要你检查各地玩家的相邻壁。这将引入一种更简洁的迭代phys方法中碰撞检查的方法。

这样的改进看起来像:

public boolean phys(Player plr) 
{ 
    java.awt.Rectangle playerBounds = new java.awt.Rectangle(plr.x, plr.y, BLOCK_SIZE, BLOCK_SIZE); 

    for (int y = 0; y < 3; y++) 
    { 
     for (int x = 0; x < 3; x++) 
     { 
      // Skip the tile the player is on assuming that he is not on a wall already 
      if (x == 1 && y == 1) continue; 

      java.awt.Rectangle bounds = new java.awt.Rectangle(/*tile at (x, y) xpos*/, /*tile at (x, y) ypos*/, BLOCK_SIZE, BLOCK_SIZE); 

      if (bounds.intersects(playerBounds)) 
      { 
       return true; 
      } 
     } 
    } 

    // Did not collide 
    return false; 
} 
+1

谢谢,我用这个作为一个指针和固定它。我修改的代码; https://gist.github.com/4485362 –