Как сделать коллизию между гранатой и полом в pygame?

Я хочу сделать гранату в игре но, не знаю как сделать чтобы она оставалась на блоках.
использую python с библиотекой pygame
61dbf7b4ce12e663721851.png
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fallervood
@Fallervood
Коллизия должна быть не между, а на полу и на гранате..
Ответ написан
TalismanChet
@TalismanChet
Лицо зла
Давайте представим ситуацию: изображение гранаты перекрыло изображение земли:

Пусть Rect земли = Rect(0, 90, 100, 10) с окном 100х100рх

Случай 1.

Пусть х и у гранаты хранятся отдельно.
Тогда нужно создать новый Rect с координатами гранаты и размером желаемого хитбокса. Если включить отрисовку такого Rect'а, то можно увидеть такую картину:

6224b13196b27565859800.png

То есть, это и есть хитбокс гранаты.

Далее мы должны взять каждую точку хитбокса на картинке (это хорошо работает с маленькими целевыми и большими проверяющими хитбоксами, если бы земля была маленькой, а граната - огромной, то проверку нужно было бы делать и от земли к гранате и от гранаты к земле) и сравнить перекрывание с хитбоксом земли:
groundRect.collidepoint(granadeRectPoint)
# True если перекрывается

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

Случай 2.

Пусть х и у гранаты равны х и у изображения.
Тогда нужно извлечь Rect с координатами гранаты из изображения:

granadeRect = granadeImage.get_rect()

Если включить отрисовку такого Rect'а, то можно увидеть такую картину:

6224b13196b27565859800.png

То есть, это и есть хитбокс гранаты.

Далее мы должны взять каждую точку хитбокса на картинке (это хорошо работает с маленькими целевыми и большими проверяющими хитбоксами, если бы земля была маленькой, а граната - огромной, то проверку нужно было бы делать и от земли к гранате и от гранаты к земле) и сравнить перекрывание с хитбоксом земли:
groundRect.collidepoint(granadeRectPoint)
# True если перекрывается

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы