Извините за несчастный английский,
Я работаю над разрешением столкновений в гоночной игре сверху вниз.
Обнаружение столкновения сделано из изображения, которое содержит два цвета (белый — стена, а черный — не стена). Я просто смотрю, находится ли среднее положение плеера (машины) внутри белого цвета на изображении.
эта часть работает нормально.
Когда дело доходит до разрешения, у меня появляются странные ошибки.
Я должен убедиться, что машина останется на трассе и не сможет выбраться из нее.
Мое сломанное решение выглядит так:
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);
}
Я был бы признателен всем, кто может указать, как я потерпел неудачу в моей попытке (или может предложить другой способ решения проблемы)
Задача ещё не решена.
Других решений пока нет …