我目前的做法是检查我的数组并为每个不同的值创建案例。它适用于只有1或2个可碰撞瓷砖的小地图,但如果我有超过100个,我必须创建超过100个案例,如果玩家进入另一个地图,我将不得不创建更多非常低效的案例。有没有更好的方法可以与玩家进行瓷砖地图碰撞?
例如
int x = player.getPlayerPositionX() / map.getTileWidth();
int y = player.getPlayerPositionY() / map.getTileHeight();
switch (player.getDirection())
{
case 3:
if (map.data[x + y * map.getMapWidth()] == 1)
{
player.moveRect(1.0f, 0);
}
break;
case 4:
x = (player.getPlayerPositionX() + 20) / map.getTileWidth();
if (map.data[x + y * map.getMapWidth()] == 1)
{
player.moveRect(-1.0f, 0);
}
break;
}
通常,游戏中的牌应标记为可通过或无法通过。无需检查每种可能的情况。
struct Tile {
bool passable;
};
bool collision(tileMap, playerCharacter) {
if(tileMap[playerCharacter.x][playerCharacter.y].Tile != passable) {
//some collision logic here
}
}
我想你的问题是关于space partitionning。在您的情况下,如果您的瓷砖具有已知尺寸,并存储在网格中(2d数组);您可以使用整数除法(播放器坐标的平铺宽度)来确定网格中的索引以检查您的碰撞。对于“保守性”,你也会检查邻居,这样你就可以确保跨越玩家的大小并检查激活的牌。我在极端大屠杀中实现了多个版本,你可以参考zip https://sourceforge.net/projects/extremecarnage/中的源代码,有一个用于横向构建的二叉树版本,以及用于敌人存储分区的网格/磁贴版本