我自上而下的赛车游戏的碰撞解决方案并不常用

时间:2017-06-17 03:12:39

标签: c++ collision game-physics sfml racing

抱歉可怜的英语,

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

这部分工作正常。

说到解决方案,我遇到了一些奇怪的错误。 我很乐意确保汽车停留在赛道上并且无法摆脱它。

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

如果有人能够指出我的尝试失败(或者可以提出解决问题的其他方法),我将不胜感激。

0 个答案:

没有答案