对不起可怜的英语,
我正在研究自上而下赛车游戏的碰撞解决方案。碰撞检测由包含两种颜色(白色是墙,黑色不是墙)的图像组成。我只是看看玩家(汽车)的中间位置是否在图像的白色内部。
这部分工作正常。
在解决问题时,我遇到了一些奇怪的错误。我应该确保汽车保持在赛道上并且无法脱离赛道。
我破碎的解决方案是这样的: 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);
}
我会感谢任何能指出我的尝试失败的人(或者可以提出其他解决问题的方法)