Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 24.11.2021
Сообщений: 13

Как реализовать коллизии силами только PyGame и Python?

02.05.2024, 01:49. Показов 1117. Ответов 3

Студворк — интернет-сервис помощи студентам
Итак, я очень много искал информацию о том, чтобы реализовать то, что я хочу...

А именно, я хочу понять: как реализовать не просто тупо сам факт пересечения объектов - это делается при помощи встроенных методов прямоугольников
Code
1
rect.colliderect(), rect.collidepoint() и тд.
а непосредственно столкновение со стенами!
Чтобы у меня был объект, который в перспективе мог бы падать вниз или идти в любом из направлений, при этом сталкиваясь со стенами ровно в том месте, где эта стена и стоит...

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

Прошу, помогите, если кто уже решал такую проблему...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2024, 01:49
Ответы с готовыми решениями:

Коллизии в Pygame
1)Хочу создать игра на Python. Проблема с коллизиями, не могу сделать так чтобы сталкивались два спрайта. Есть два вида коллизий...

Как установить Pygame на Python 3.8
Здравствуйте! Никак не могу установить PyGame на компьютер уже писал в CommandLine такие строки: pip3 install pygame pip install pygame...

Как смещать платформы по оси x? (Python + PyGame)
Приветствую всех пользователей, помогите сделать смещения платформ по оси x. Вот часть кода Массив level это сама карта. level = ...

3
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
03.05.2024, 13:36
Думаю вам нужно работать с физикой
https://www.youtube.com/watch?v=rF1ra9xm9Pc
У данного товарища много интересного познавательного на канале.
0
0 / 0 / 0
Регистрация: 24.11.2021
Сообщений: 13
03.05.2024, 23:43  [ТС]
Ах, если бы всё было так просто

Мне нужна не просто работа с физикой, а полноценный контроль над персонажем

Кроме того, в видосе используется Pymunk, на который гайдов, извиняюсь, кот наплакал, а документация...
Ну да, она есть, но, буду честен, я не хочу читать её всю ради того, чтобы реализовать движение кинематического тела...

Я уже такое множество способов реализации коллизий испробовал...
Почему-то на ютубе у всех всё легко, буквально пара строк - коллизии готовы и без всяких танцев с бубном, но когда я фактически повторяю логику из видоса для своего кода - у меня ничего не работает...

Сейчас я добился такого, что коллизии работают, но только наполовину - они работает правильно лишь при условии однонаправленного движения, а при движении по диагонали - меня просто выкидывает в противоположную моей диагонали сторону
0
0 / 0 / 0
Регистрация: 24.11.2021
Сообщений: 13
04.05.2024, 18:02  [ТС]
Я нашёл решение и оно оказалось достаточно простым

Вот код с примером
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import pygame as pg
 
 
def collide(dx, dy, rect: pg.Rect):
    global player
    if player.colliderect(rect):
        if dx > 0:
            player.right = rect.left
        if dx < 0:
            player.left = rect.right
        if dy > 0:
            player.bottom = rect.top
        if dy < 0:
            player.top = rect.bottom
 
def get_axis(negative, positive):
    if negative:
        return -1
    if positive:
        return 1
    else:
        return 0
 
 
WIDTH, HEIGHT = 1280, 720
CENTER = (WIDTH // 2, HEIGHT // 2)
FPS = 30
 
screen = pg.display.set_mode((WIDTH, HEIGHT))
run = True
clock = pg.time.Clock()
elapsed = 1 / FPS
 
player = pg.Rect(0, 0, 40, 40)
player.center = CENTER
 
direction = [0, 0]
 
my_rect1 = pg.Rect(100, CENTER[1] + 100, WIDTH - 100, 20)
 
while run:
    screen.fill((0, 0, 0))
    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False
 
    pg.draw.rect(screen, pg.Color("red"), player)
    pg.draw.rect(screen, pg.Color("green"), my_rect1)
 
    keys = pg.key.get_pressed()
    direction = get_axis(keys[pg.K_a], keys[pg.K_d]), get_axis(keys[pg.K_w], keys[pg.K_s])
 
    player.right += direction[0] * elapsed
    collide(direction[0], 0, my_rect1)
    player.bottom += direction[1] * elapsed
    collide(0, direction[1], my_rect1)
 
 
    pg.display.flip()
    elapsed = clock.tick(FPS)
Вся суть алгоритма сводится к следующему: мы точно знаем в каком направлении движется наш игрок - на основе этого можем сделать выводы о том, какую из сторон к какой стоит приравнивать

Мы должны делать шаг по одной из осей и после этого проверять столкновение

Почему нельзя использовать один вызов функции для всех 4-ох возможных сторон?
-В таком случае будут возникать баги - отвечу Я!
При движении по диагонали и реализации через единый вызов - вас будет выбрасывать по ту сторону прямоугольника, которая противоположна направлению вашей диагонали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2024, 18:02
Помогаю со студенческими работами здесь

Как реализовать горизонтальный скроллинг с pygame?
Как реализовать горизонтальный скроллинг с pygame?

Коллизии с объектами 3D ака алгоритм коллизии(модер прочитай, потом пинай)
Прошу помощи у форумчан! Не стал кидать тему в тему мультимедии, т.к. напрямую задача не требует отрисовки в 3д. И так, что есть: на...

Как отобразить только содержимое окна, скрыв очертания, в PyGame?
Как отобразить содержимое окна, но не отображать/скрыть само окно с изпользованием pyGame? Нашел как скрыть заголовок и рамку окна, но...

Рисование силами С++ DirectX в контексте python
Изучаю С++. Интересует крос-платформенная разработка. Для С++ на каждой платформе необходимо по разному выводить окна или использовать...

Многоуровневая группировка строк в Excel силами Python
Python 3.8.0 ОС: Windows 10 Используемые библиотеки: win32com.client Добрый день. Подскажите, пожалуйста, как сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru