我正在制作一个类似于马里奥的游戏,我已经得到了这个由数组和图像生成的地图。但我的问题是我不知道如何为所有瓷砖制作一个hitbox系统。我试图根据你在地图上的位置建立一个基于位置的碰撞系统
像这样if(xpos > 10*mapX && xpos < 14 * mapX){
ypos -= 1;
}
但我不希望每个墙壁或洞都这样。 那么有没有办法检查角色的前方,下方和上方,看看那里是否有一个击球手,如果你不能移动那个方向或掉落?
谢谢
答案 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