抱歉可怜的英语,
我正在研究自上而下的赛车游戏的碰撞解决方案。 碰撞的检测是由包含两种颜色的图像(白色是墙壁而黑色不是墙壁)制成的。我只是看看玩家(汽车)中间位置是否在图像上的白色内。
这部分工作正常。
说到解决方案,我遇到了一些奇怪的错误。 我很乐意确保汽车停留在赛道上并且无法摆脱它。
我破碎的解决方案是这样的: 1.创建一个名为“距离”的向量,其中包含当前位置对前一个位置的减法 2.将距离矢量标准化为0到1之间 3.将此标准化距离矢量减去当前位置,直到播放器不是白色。 4.取消玩家的速度(我不打算保持这样)
这听起来不错,但是当我应用它时,我会遇到一些分段错误,偶尔会有一些传送错误。
以下代码是使用SFML库编写的,这是我尝试进行冲突。最后的player.update()调用只会移动并旋转汽车。
void RacingMode::update(const sf::Time& deltaTime)
{
static sf::Vector2f prevPos(0,0);
static sf::Vector2f currPos(0,0);
currPos = sf::Vector2f(player.getPosition().x, player.getPosition().y);
if(raceTrack.getPixelColor(sf::Vector2u(currPos.x, currPos.y)) != sf::Color::Black){
sf::Vector2f dist;
dist.x = currPos.x - prevPos.x;
dist.y = currPos.y - prevPos.y;
dist.x = dist.x / sqrt(dist.x*dist.x + dist.y*dist.y);
dist.y = dist.y / sqrt(dist.x*dist.x + dist.y*dist.y);
sf::Vector2f newPos(0,0);
float i = 0.0;
do{
newPos = currPos - dist*i;
i+= 0.01;
}while(raceTrack.getPixelColor(sf::Vector2u(newPos.x, newPos.y)) != sf::Color::Black);
currPos = newPos;
player.setPosition(newPos);
player.setVelocity(0);
}
prevPos = currPos;
player.update(deltaTime);
}
如果有人能够指出我的尝试失败(或者可以提出解决问题的其他方法),我将不胜感激。