Реакция на столкновение в 2D-игре с боковым скроллером, похожей на «Марио»

Это сильно беспокоило меня в последние несколько недель. В это время я проводил исследования в Интернете, даже читал книги в разделе «Компьютеры» на сайте Borders, чтобы попытаться найти ответ, но мне не очень повезло.

Я запрограммировал 2D-редактор уровней для видеоигр с боковой полосой прокрутки. Теперь я хочу превратить его в игру, в которой у меня есть игрок, который может бегать и прыгать, чтобы исследовать уровень, как в «Марио».

Что действительно беспокоит меня, так это реакция на столкновение (не обнаружение: я уже знаю, как определить, сталкиваются ли два блока). Вот несколько сценариев, которые я собираюсь проиллюстрировать, чтобы вы могли увидеть мои проблемы (заштрихованные блоки - это земля, стрелка - вектор скорости игрока, пунктирные линии - проецируемый путь игрока).

См. Это изображение сценария реакции на столкновение:

example http://dl.dropbox.com/u/12556943/collision_detection.jpg

Предположим, что векторы скорости в сценариях (1) и (2) равны (одинаковое направление и величина). Тем не менее, в сценарии (1) игрок попадает в сторону блока, а в сценарии (2) игрок приземляется на вершину блока. Это позволяет мне сделать вывод, что определение реакции на столкновение зависит не только от вектора скорости игрока, но и от его относительного положения относительно сталкивающегося блока. Это приводит к моему первому вопросу: зная вектор скорости и относительное положение игрока, как я могу определить, с какого направления (слева, справа, сверху или снизу) игрок сталкивается с блоком?

Другая проблема, с которой я столкнулся, заключается в том, как определить реакцию на коллизию, если игрок сталкивается с несколькими блоками в одном кадре. Например, предположим, что в сценарии (3) игрок сталкивается с обоими блоками одновременно. Я предполагаю, что мне придется перебирать каждый блок, с которым игрок сталкивается, и соответственно корректировать реакцию каждого блока. Подводя итог, это мой второй вопрос: как мне обработать реакцию на столкновение, если игрок сталкивается с несколькими блоками?

Обратите внимание, что я никогда не раскрывал язык, на котором я программирую; это потому, что я бы предпочел, чтобы вы не знали (впрочем, ничего личного:]). Меня больше интересует псевдокод, чем код для конкретного языка.

Спасибо!

11
задан Sam 29 November 2011 в 02:57
поделиться