AABB глюки обнаружения столкновений при использовании более чем одного нажатия клавиши

В настоящее время я проектирую 2d платформер, и я реализовал обнаружение столкновений, где мой код выглядит следующим образом:

if (keys['W']){ checkCollision(vector of bounded boxes, direction; }
if (keys['A']){ checkCollision(vector of bounded boxes, direction; }

так далее…

checkCollision(vector, direction){
for(each boundary box){
if (dir == 'UP'){
if (AABB collision check){hit = true;}
else{hit = false;}
walk(velocity, direction);
}
else if (dir == 'RIGHT'){
if (AABB collision check){hit = true;}
else{hit = false;}
walk(velocity, direction);
}
}
}

так далее…

walk(velocity, direction){
if (dir == 'UP'){
if (hit){ y -= 2; }
else{ y += velocity; }
}
else if (dir == 'RIGHT'){
if (hit){ x -= 2; }
else{ x -= velocity; }
}

так далее…

Все это, кажется, работает хорошо, однако при столкновении с объектом по горизонтали, если я продолжаю удерживать правую клавишу и нажимаю клавишу вверх, функция распознает, что объект все еще сталкивается, затем применяет ту же силу, которая была бы применена, если объект в -game прыгнул и столкнулся выше, поэтому объект в игре отталкивается, даже если нет силы вверх.

Я попытался реализовать отдельные логические значения для столкновений в X и Y, однако это не повлияло на результат.

Единственное исправление, которое я нашел, — это если при обработке ключей я использую else if вместо if. Однако это обеспечивает очень линейное движение, и объект не может двигаться по диагонали.

Какие-либо предложения?

0

Решение

Проблема, с которой вы сталкиваетесь, заключается в том, что вы связаны в системах ввода и столкновения. Система ввода должна перемещать игрока только в соответствии с нажатиями клавиш. Система обнаружения / обработки столкновений должна исключительно заботиться о столкновениях. Как только вы отсоедините их, вещи станут намного чище.

// Main loop
while(1) {

handleInput();
...
handleCollisions();
...
}

Если в вашей игре слишком много объектов, вы можете использовать пространственное разбиение чтобы уменьшить количество проверок столкновений, которые вы должны сделать. В противном случае вам не нужно беспокоиться об этом.

0

Другие решения


По вопросам рекламы [email protected]