Pygame. Столкновения масок. Метод overlap_area
Я пишу игру на pygame. В этой игре на одном из уровней платформер и я по глупости решила однотипные элементы, т.е. платформы или воду или прыгательные кнопки, нарисовать картинкой формата png. Потом убрать у этого фон и обрабатывать как одну картинку. Менять это всё очень долго, поэтому пытаюсь работать с тем, что имею.
Проблемы начинаются при проверке столкновений персонажа и спрайтов. Т.е. с самой проверкой проблем никаких нет. Проблемы с тем, чтобы персонаж не проваливался в платформу и другие объекты. Я пробовала определять с помощью pygame.sprite.collide_mask на сколько персонаж проваливается в спрайт и просто поднимать или опускать на y и двигать на x. Это работает, но получается, что когда персонаж сталкивается с какой-то стеной (или другим объектом), он начинает подниматься на y и получается лифт. А ещё он когда сталкивается снизу с платформой, поднимается на её верх.
Поэтому я решила, что этот способ не работает и решила делать по-другому. Я использую mask.overlap_area для того, чтобы определить с какой стороны он сталкивается со спрайтом:
dx = -t.mask.overlap_area(self.mask,(x + 1, y)) + self.mask.overlap_area(self.mask,(x - 1, y))
dy = -t.mask.overlap_area(self.mask,(x, y + 1)) + self.mask.overlap_area(self.mask,(x, y - 1))
и в зависимости от этого изменяю координаты игрока
if dy != 0:
if dy > 0:
self.rect.y -= abs(y - self.mask.get_rect()[3])
elif dy < 0:
self.rect.y += abs(y - self.mask.get_rect()[3])
if dx != 0:
if dx < 0:
self.rect.x += abs(x - self.mask.get_rect()[2])
elif dx > 0:
self.rect.x -= abs(x - self.mask.get_rect()[2])
Тут всё строится на том, что если персонаж падает сверху, то dx = 0, а если столкновение происходит слева, то dy = 0, но у меня так не работает и когда персонаж падает на платформу и dx и dy почему-то положительные.
Почему это происходит? Что я делаю не так?
Помогите, пожалуйста, это исправить. Заранее спасибо)
выводи в консоль данные, которые получаешь и сравниваешь + результат, думаю картина будет ясна. а так помочь тут не особо получится, по причине:
1. питонячий код требует отступов
2. не с эмулировать входные и выходные данные