2016-01-29 2 views
0

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

if player.rect.left >= rect.right + 1: 
     player.undo_right() 
    if player.rect.right <= rect.left - 1: 
     player.undo_left() 
    if player.rect.bottom <= rect.top + 2: 
     player.undo_top() 
    if player.rect.top >= rect.bottom + 2: 
     player.undo_bottom() 

В настоящий момент это управляет некоторым основным обнаружением столкновения. Если значение x-значение/y игрока игрока больше/меньше целевой поверхности, игрок перемещается на определенную величину. Проблема в том, что это просто делает игрока «неустойчивым», и игрок все еще может пройти через мой объект.

Итак, я думаю, мой вопрос на этом этапе - как я могу сделать так, чтобы игрок не мог пройти через объект? Я пробовал player.rect.colliderect, но получил тот же результат, что и выше.

Существует не простой способ сделать это эффективно, поэтому я обращаюсь к вам, ребята. Я мог бы ударить головой о стену в течение нескольких часов, но сначала я хотел бы получить критику и совет от сообщества.

В любом случае, спасибо заранее.

+0

Я думаю, что проблема может быть во всем коде, не только в этой части, поэтому никто не может ответить на ваш вопрос. – furas

+0

В данный момент я могу только предложить проанализировать код в [Примеры для платформы] (http://programarcadegames.com/index.php?chapter = example_code & lang = pl # section_38) (в конце страницы) – furas

ответ

1

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

Гораздо проще сказать, когда объекты не сталкиваются, чем это говорит о том, как они если они это сделают. Если правая сторона одного объекта находится слева от левой стороны другого объекта, они, очевидно, не могут касаться вообще. Аналогично с другими парами «лицевых» сторон. Возможно, стоит сначала использовать эти быстрые тесты, прежде чем погрузиться в сложные детали того, как именно два встречных прямоугольника находятся в контакте.

Потому что существует множество способов, которыми пара прямоугольников может сталкиваться! По моему мнению, существует 16 разных способов. Существует четыре вида «угловых» столкновений, в которых ровно один угол каждого прямоугольника находится внутри другого прямоугольника. Затем у вас есть восемь «краевых» столкновений, где один край одного прямоугольника полностью находится внутри другого прямоугольника (по одному случаю для каждого края каждого прямоугольника). Тогда есть четыре случая, когда прямоугольники полностью взаимопроникают, либо образуя поперечную форму (с двумя ориентациями), либо один прямоугольник полностью внутри другого.

Теперь, для вашей игры вы можете исключить некоторые из этих видов столкновений. Если ваши объекты перемещаются медленно относительно их размера, так что скорость объекта (в пикселях/кадрах) не превышает размер любого другого объекта в данном измерении, вы можете пропустить четыре случая взаимопроникновения. И если все объекты имеют одинаковый размер, вы можете обращаться с краевыми случаями, такими как угловые шкафы (или наоборот, возможно, с некоторыми настройками). Вы также можете использовать свои знания относительной скорости объекта для оценки того, как они сталкиваются, не погружаясь в детали (например, если игрок движется вправо, его левая сторона не может столкнуться со стеной).

Но все это зависит от деталей вашей игры. В двигателе общего назначения вам может потребоваться решить все 16 случаев.

+0

Итак, я обнаружил, что обнаружение столкновений обрабатывается для большой группы объектов, однако теперь у меня другая проблема: обнаружены конфликты, но не постоянно , Таким образом, игрок останавливается на твердом объекте в течение определенного времени, а затем телепортируется через объект. Это согласовано при приближении к объекту с левой/правой стороны. Когда игрок приближается к объекту сверху/снизу, игрок «сползает», как и он, он попадает в верхнюю часть объекта, а затем переместится на левую/правую сторону, а затем ударяет снизу и падает вниз (применяется гравитация). –

 Смежные вопросы

  • Нет связанных вопросов^_^