0

对不起可怜的英语,

我正在研究自上而下赛车游戏的碰撞解决方案。碰撞检测由包含两种颜色(白色是墙,黑色不是墙)的图像组成。我只是看看玩家(汽车)的中间位置是否在图像的白色内部。

这部分工作正常。

在解决问题时,我遇到了一些奇怪的错误。我应该确保汽车保持在赛道上并且无法脱离赛道。

我破碎的解决方案是这样的: 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);
}

我会感谢任何能指出我的尝试失败的人(或者可以提出其他解决问题的方法)

4

0 回答 0