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

Коллизии

15.12.2019, 12:45. Показов 7117. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте,после моей последней темы Pygame, построение блоков по шаблону я стал разбираться с шаблоном и натолкнулся на 2 проблемы.
1. Сейчас программа считает все блоки непреодолимым препятствием. Но ведь кроме стен есть разные блоки которые должны обрабатывать коллизию, но при этом не останавливать игрока. Обычно при таких случаях (ну насколько я понимаю ) коллизии запихивают в разные группы, соответственно на каждое столкновение каждой группе прописывают свое последствие. Я пытался сделать тут что то подобное - не получилось.
2. Вот это совсем выше моего понимания. Я пытался сделать просто пустой спрайт без коллизии изменив вот эту строку
pygame.Rect(x*64, y*64, 64, 64)
насколько я знаю первые два значения это координаты на которой будет расположена коллизия, а вторые два это просто размеры по ширине и высоте. По логике если в последние две цифры заменить на 0 то и коллизии не будет (я так думал), но даже если выставить их на 0 то при любом раскладе в верхнем левом углу все равно будет 4 пикселя коллизии (2*2). собственно как так то? Все текстуры в прошлой теме.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import sys
import pygame
 
pygame.init()
screen = pygame.display.set_mode((800
                                  , 600))
BLOCK_COLOR = (50, 50, 255)
BG_COLOR = (0, 0, 0)
 
level = ["#############",
         "#===========#",
         "#==#######==#",
         "#=====#=====#",
         "#===========#",
         "#====Q======#",
         "#===========#",
         "#===========#",
         "#############",]
 
player_rect = pygame.Rect((64*3, 64, 64, 64))
clock = pygame.time.Clock()
image = pygame.image.load('textures/stena.png')
trava = pygame.image.load('textures/trava.png')
 
def makelevel(level):
    collidelist = []
    for y, line in enumerate(level):
        for x, character in enumerate(line):
            if character == "#":
                test = pygame.Rect(x*64, y*64, 64, 64) #Пытался дать разные имена думая что это поможет, никак  не помогло, повторяю по буквам Николай, Илья, Харитон, Ульяна, Ярослав. Никак не помогло.
                collidelist.append((test, image))
            if character == "Q":
                block = pygame.Rect(x*64, y*64, 64, 64)
                collidelist.append((block, trava))
    return collidelist
 
 
 
def move(xvel, yvel, player_rect, collidelist):
    player_rect.x += xvel
    for testblock in collidelist:
        testblock = testblock[0]  #Пытался дать разные имена думая что это поможет, никак  не помогло, повторяю по буквам Николай, Илья, Харитон, Ульяна, Ярослав. Никак не помогло.
        if player_rect.colliderect(testblock): 
            if xvel < 0: 
                player_rect.left = testblock.right
            elif xvel > 0:  
                player_rect.right = testblock.left
            break
 
    player_rect.y += yvel
    for block in collidelist:
        block = block[0]
        if player_rect.colliderect(block):
            if yvel < 0:
                player_rect.top = block.bottom
            elif yvel > 0:
                player_rect.bottom = block.top
            break
 
collidelist = makelevel(level)
 
while True:
    for event in pygame.event.get ():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
 
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_RIGHT]:
        move(4, 0, player_rect, collidelist)
    if pressed[pygame.K_LEFT]:
        move(-4, 0, player_rect, collidelist)
    if pressed[pygame.K_UP]:
        move(0, -4, player_rect, collidelist)
    if pressed[pygame.K_DOWN]:
        move(0, 4, player_rect, collidelist)
 
 
    screen.fill(BG_COLOR)
 
    for rect in collidelist:
        screen.blit(rect[1], rect[0])
 
    pygame.draw.rect(screen, (255, 255, 255), player_rect)
 
    pygame.display.update()
    clock.tick(30)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2019, 12:45
Ответы с готовыми решениями:

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

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

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

5
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
16.12.2019, 14:20
Цитата Сообщение от Kxarog Посмотреть сообщение
1. Сейчас программа считает все блоки непреодолимым препятствием. Но ведь кроме стен есть разные блоки которые должны обрабатывать коллизию, но при этом не останавливать игрока. Обычно при таких случаях (ну насколько я понимаю ) коллизии запихивают в разные группы, соответственно на каждое столкновение каждой группе прописывают свое последствие. Я пытался сделать тут что то подобное - не получилось.
2. Вот это совсем выше моего понимания. Я пытался сделать просто пустой спрайт без коллизии изменив вот эту строку
pygame.Rect(x*64, y*64, 64, 64)
Вам надо книжку по питону почитать, вы не имена даете, а просто названия переменных, сделать можно как-то так

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import sys
import pygame
 
pygame.init()
screen = pygame.display.set_mode((800, 600))
BLOCK_COLOR = (50, 50, 255)
BG_COLOR = (0, 0, 0)
 
level = ["############",
         "#==========#",
         "#==#######=#",
         "#=====#====#",
         "#====Q=====#",
         "############",]
 
player_rect = pygame.Rect((64*3, 64, 64, 64))
clock = pygame.time.Clock()
image = pygame.image.load('textures/stena.png')
trava = pygame.image.load('textures/trava.png')
speed = 5
 
 
def makelevel(level):
    collidelist = []
    for y, line in enumerate(level):
        for x, character in enumerate(line):
            if character == "#":
                block = pygame.Rect(x*64, y*64, 64, 64)
                collidelist.append((block, image, 'block'))
            if character == "Q":
                block = pygame.Rect(x*64, y*64, 64, 64)
                collidelist.append((block, trava, 'grass'))
    return collidelist
 
 
def move(xvel, yvel, player_rect, collidelist):
    global speed
    player_rect.x += xvel
    for block in collidelist:
        if block[2] == 'grass':
            continue
        block = block[0]
        if player_rect.colliderect(block):
            if xvel < 0: 
                player_rect.left = block.right
            elif xvel > 0:  
                player_rect.right = block.left
            break
 
    player_rect.y += yvel
    for block in collidelist:
        if block[2] == 'grass':
            continue
        block = block[0]
        if player_rect.colliderect(block):
            if yvel < 0:
                player_rect.top = block.bottom
            elif yvel > 0:
                player_rect.bottom = block.top
            break
 
collidelist = makelevel(level)
 
while True:
    for event in pygame.event.get ():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
 
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_RIGHT]:
        move(speed, 0, player_rect, collidelist)
    if pressed[pygame.K_LEFT]:
        move(-speed, 0, player_rect, collidelist)
    if pressed[pygame.K_UP]:
        move(0, -speed, player_rect, collidelist)
    if pressed[pygame.K_DOWN]:
        move(0, speed, player_rect, collidelist)
 
 
    screen.fill(BG_COLOR)
 
    for rect in collidelist:
        screen.blit(rect[1], rect[0])
 
    pygame.draw.rect(screen, (255, 255, 255), player_rect)
 
    pygame.display.update()
    clock.tick(30)
1
1 / 0 / 1
Регистрация: 01.06.2019
Сообщений: 61
16.12.2019, 18:15  [ТС]
За помощь пусть даже только по 1 вопросу спасибо!

А насчет
Цитата Сообщение от tooru Посмотреть сообщение
Вам надо книжку по питону почитать
Зазубривание книг для слабаков! Только разбор реальных примеров! Только страдания и боль!

А если серьезно я уже отвечал на подобное заявление несколько тем назад, но не поленюсь и отвечу еще раз.
Как по мне данный метод ужасно скучный, занудный и ограниченный. Многие примеры/темы в тех же книгах либо устаревшие, либо имеют только поверхностное описание, либо вообще относится к тому что меня не интересует. Поэтому я как Ленин решил пойти другим путем, а именно брать готовые участки кода и потихоньку разбирать и понимать что к чему.

Может я не прав, может я буду обучатся дольше чем другие кто прочитал книги. Но если взять меня полгода назад, который видя код падал на колени и в страхе начинавшего креститься и сейчас нынешнего, я понимаю что прогресс какой никакой, но есть. А значит такое обучение работает. А это значит "Только разбор реальных примеров! Только страдания и боль!"

P. S. Хотя ради любопытства спрошу какую(ие) книгу(и) вы бы посоветовали?
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
16.12.2019, 18:33
Цитата Сообщение от Kxarog Посмотреть сообщение
Хотя ради любопытства спрошу какую(ие) книгу(и) вы бы посоветовали?
Лутц М. - Программирование на Python
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
17.12.2019, 02:00
Цитата Сообщение от Kxarog Посмотреть сообщение
P. S. Хотя ради любопытства спрошу какую(ие) книгу(и) вы бы посоветовали?
А как же
Цитата Сообщение от Kxarog Посмотреть сообщение
Зазубривание книг для слабаков!
Читайте сугубо официальную документацию, https://www.python.org/doc/ в помощь.
0
1 / 0 / 1
Регистрация: 01.06.2019
Сообщений: 61
17.12.2019, 18:24  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
А как же
Сообщение от Kxarog
Зазубривание книг для слабаков!
Я просто хотел знать что читают слабаки(нормально отмазался...)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2019, 18:24
Помогаю со студенческими работами здесь

Коллизии
Здравствуйте! как уменьшить/исключить коллизии? Добавлено через 9 минут от чего зависит их число/масштабы? в данный момент в сети...

Коллизии
Коммутатор при работе в режиме &quot;cut-through&quot; продлевает домен коллизий?

коллизии
алгоритм разрешения коллизии с помощью косвенной адресации я так думаю, что замешана хеширование. но мало что понимаю. Как его...

Коллизии
Объясните как происходят коллизии в сети Написано, когда по одной витой паре в приблизительно(от себя) равный момент времени посылаются 2...

Коллизии в 2д
Пытаюсь сделать взаимодействие объектов в 2д, но почему то они не реагируют. Что не так делаю? объект fish проходит сквозь botCollider. ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru