如何制作一个hitbox?

时间:2013-08-19 12:16:22

标签: java

我正在制作一个类似于马里奥的游戏,我已经得到了这个由数组和图像生成的地图。但我的问题是我不知道如何为所有瓷砖制作一个hitbox系统。我试图根据你在地图上的位置建立一个基于位置的碰撞系统

像这样

if(xpos > 10*mapX && xpos < 14 * mapX){
    ypos -= 1;
}

但我不希望每个墙壁或洞都这样。 那么有没有办法检查角色的前方,下方和上方,看看那里是否有一个击球手,如果你不能移动那个方向或掉落?

谢谢

2 个答案:

答案 0 :(得分:1)

如果这是一个简单的2D游戏,我建议将地图划分为方形图块。您可以将地图作为二维数组存储在内存中,并在每个帧中检查与播放器相邻的切片。当然,他在移动过程中可以占用多达4个瓷砖,但它最多可以检查12个位置,这很容易完成。

使用图像位置和尺寸可以轻松完成进一步的碰撞检查。

请记住,无需检查静态对象(环境)是否与某些东西发生碰撞,您只需要检查自上一帧以来已移动的对象,即玩家和精灵。

修改

假设你有以下地图部分(变量 map ):

...
.pe
ooo

,其中

. = nothing
p = player
o = floor
e = enemy

您还有一对(x, y)代表玩家的图块索引(不是确切位置)。在这种情况下,你必须做这样的事情:

if ("o".equals(map[y + 1, x + 1]))
//floor is under
if ("e".equals(map[y, x + 1]))
//enemy is on the right
if ("o".equals(map[y - 1, x]))
//floor is above us

如果满足任何这些条件,则必须检查图像位置并处理碰撞。

答案 1 :(得分:0)

注意:在上一篇文章发布后点击提交方式......

正如Mateusz所说,2D阵列最适合这种类型的游戏:

e.g。使用字符:

 0123456789012
0           ==
1        * ===
2===== =======

所以在这种情况下tileMap [8] [1] =='*'。你可能最好使用枚举而不是字符,例如Tile.SPRING用于Sonic风格的弹簧板。

如果您的地图由常规尺寸的瓷砖组成,您可以说:

int xInFrontOfPlayer = playerX + PLAYER_WIDTH;
int xBehindPlayer = playerX - PLAYER_WIDTH;

Tile tileInFrontOfPlayer = getTileAtWorldCoord(xInFrontOfPlayer, playerY);
Tile tileBehindPlayer = getTileAtWorldCoord(xBehindPlayer, playerY);

...

public Tile getTileAtWorldCoord(int worldX, worldY) {
    return tileMap[worldX / TILE_WIDTH][worldY / TILE_HEIGHT];
}

其中TILE_WIDTH和TILE_HEIGHT是瓷砖的尺寸(以像素为单位)。然后对yAbovePlayer和yBelowPlayer使用类似的数学。

您可能在游戏循环中有一些逻辑:

if user is pressing the "go right" key:
      if the tile to the right is Tile.SPACE:
            move player right
      else if the tile to the right is Tile.WALL:
            don't do anything

if the tile below is Tile.SPACE:
    fall