C++ SFML与tilemaps的冲突
我目前的做法是对照我的数组进行检查,并为我得到的每个不同的值制作案例。它适用于只有1或2个可对撞图块的小地图,但如果我有100多个图块,我就必须创建100多个图块,如果玩家进入另一个地图,我就必须创建更多的图块,这是非常低效的。有没有更好的方法可以和玩家进行tilemap碰撞 比如说C++ SFML与tilemaps的冲突,c++,sfml,C++,Sfml,我目前的做法是对照我的数组进行检查,并为我得到的每个不同的值制作案例。它适用于只有1或2个可对撞图块的小地图,但如果我有100多个图块,我就必须创建100多个图块,如果玩家进入另一个地图,我就必须创建更多的图块,这是非常低效的。有没有更好的方法可以和玩家进行tilemap碰撞 比如说 int x = player.getPlayerPositionX() / map.getTileWidth(); int y = player.getPlayerPositionY() / map.getTile
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
}
}
我想你的问题是关于。在您的情况下,如果您有大小已知的磁贴,并且存储在栅格(2d阵列)中;您可以使用整数分割(玩家坐标的平铺宽度)来确定网格中的索引,以检查碰撞。对于“保守”,你也要检查邻居,这样你就可以确定玩家的大小,并检查激活的磁贴。我在极端屠杀中实现了多个版本,你可以参考zip中的源代码。有一个用于景观构建的二叉树版本,还有一个用于敌人存储分区的网格/瓷砖版本你所说的“制作案例”到底是什么意思?您能提供一些代码来说明您当前的方法吗?您如何存储tilemap?给我们一些代码显示您当前的状态implementation@Omni编辑以显示示例。我将tilemap存储在一个向量中,您为2个玩家移动方向显示
case
语句,而不是可碰撞的Tile;您的代码与您的问题描述不匹配。sry我的英语不是很好,我是指if语句,例如,如果我的向量中的值为1,则停止播放机移动到其中。但是如果我有更多的可碰撞图块,我就必须在向量中为更多的值这样做。所以,如果我有多达100种不同的可碰撞瓷砖,我必须为每一种瓷砖都有一个if语句。