我已经尝试了几天,花了几个小时在网上搜索无济于事。我遇到碰撞问题,我可以检测到碰撞但我的问题是阻止玩家进入碰撞。我已经尝试过所有我能想到的了。我正在检测我的tilemap的碰撞,使用1表示实体,0表示被动
for(int i = 0; i < tiles.size(); i++)
{
if(colMap[tiles[i].y][tiles[i].x] == 1)
{
myrect.setFillColor(sf::Color::Red);
collide = true;
break;
}
else
{
collide = false;
break;
}
}
这个工作正常,我的文本播放器一旦与瓷砖碰撞就会变红但是我无法弄清楚如何阻止玩家进入该瓷砖开始,我当前的设置我试图禁用运动但是所有发生的事情都是玩家进入碰撞设置为true,控件被禁用,导致玩家完全卡住。
我目前的动作非常基本
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
if(walking == false)
{
//colCheck();
if(!collide)
{
nextspot = x - tilesize;
move[LEFT] = true;
walking = true;
}else
{
std::cout << "Collsion!" << std::endl;
}
}
}
任何帮助非常感谢。
答案 0 :(得分:3)
您需要始终记录您的玩家之前的转弯位置:
static int prevY, prevX;
for(int i = 0; i < tiles.size(); i++)
{
if(colMap[tiles[i].y][tiles[i].x] == 1)
{
myrect.setFillColor(sf::Color::Red);
collide = true;
/* Return Player To Where He's Been */
colMap[prevY][prevX] = 1;
break;
}
else
{
collide = false;
break;
}
}
另一种方法是在移动前向前看:
for(int i = 0; i < tiles.size(); i++)
{
/* Look Ahead (Depends On Which Way He's Trying To Go)*/
if(colMap[tiles[i].y + newY][tiles[i].x + newX] == 1)
{
myrect.setFillColor(sf::Color::Red);
willCollide = true;
break;
}
else
{
willCollide = false;
break;
}
}
newY
和newX
可以是-1
,0
或1
。如果newY
或newX
!= 0
,则另一个必须是0
。