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

Коллизии в Pygame

21.07.2019, 16:44. Показов 17043. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1)Хочу создать игра на Python. Проблема с коллизиями, не могу сделать так чтобы сталкивались два спрайта. Есть два вида коллизий groupcollide() и spritecollide(), в первом сталкиваются две группы, во втором группа и спрайт. Хотел спросить есть ли команда в которой сталкиваются два спрайта?

2) Если я залью png изоображение стены,то коллизии будут происходить на месте есть изоображение стен или по всему изоображению?э

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
90
game_function.py
import sys
import pygame
from pygame.sprite import Sprite
from time import sleep
from bullet import Bullet
 
def check_keydown_events(event,zb_settings,screen,man,bullets_right,bullets_left,
                        bullets_up,bullets_down):
        if event.key == pygame.K_RIGHT:
            sleep(zb_settings.sleepe)
            man.moving_right = True
            man.moving_left = False
            man.moving_up = False
            man.moving_down = False
            man.image = pygame.image.load('images/man_right.png')
            zb_settings.bullet_naprav = 3
        elif event.key == pygame.K_LEFT:
            sleep(zb_settings.sleepe)
            man.moving_left = True
            man.moving_right = False
            man.moving_up = False
            man.moving_down = False
            man.image = pygame.image.load('images/man_left.png')
            zb_settings.bullet_naprav = 1
        elif event.key == pygame.K_UP:
            sleep(zb_settings.sleepe)
            man.moving_up = True
            man.moving_right = False
            man.moving_left = False
            man.moving_down = False
            man.image = pygame.image.load('images/man_up.png')
            zb_settings.bullet_naprav = 2
        elif event.key == pygame.K_DOWN:
            sleep(zb_settings.sleepe)
            man.moving_down = True
            man.moving_right = False
            man.moving_left = False
            man.moving_up = False
            man.image = pygame.image.load('images/man_down.png')
            zb_settings.bullet_naprav = 0
        elif event.key == pygame.K_SPACE:
            new_bullet = Bullet(zb_settings,screen,man)
            if zb_settings.bullet_naprav == 0:
                bullets_down.add(new_bullet)
            elif zb_settings.bullet_naprav == 1:
                bullets_left.add(new_bullet)
            elif zb_settings.bullet_naprav == 2:
                bullets_up.add(new_bullet)
            elif zb_settings.bullet_naprav == 3:
                bullets_right.add(new_bullet)
        elif event.key == pygame.K_q:
            sys.exit()
def check_key_up_events(zb_settings,event,man):
    if event.key == pygame.K_RIGHT:
        man.moving_right = False
    elif event.key == pygame.K_LEFT:
        man.moving_left = False
    elif event.key == pygame.K_UP:
        man.moving_up = False
    elif event.key == pygame.K_DOWN:
        man.moving_down = False
def check_events(zb_settings,screen,man,bullets_right,bullets_left,
                        bullets_up,bullets_down):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            check_keydown_events(event,zb_settings,screen,man,bullets_right,bullets_left,
                        bullets_up,bullets_down)
        if event.type == pygame.KEYUP:
            check_key_up_events(zb_settings, event, man)
def update_screen(zb_settings,screen,man,house,wall,bullets_right,bullets_left,
                        bullets_up,bullets_down):
    screen.fill(zb_settings.bg_color)
    house.blitme()
    wall.blitme()
    for bullet in bullets_down.sprites():
        bullet.draw_bullet()
    for bullet in bullets_right.sprites():
        bullet.draw_bullet()
    for bullet in bullets_left.sprites():
        bullet.draw_bullet()
    for bullet in bullets_up.sprites():
        bullet.draw_bullet()
    man.blitme()
    pygame.display.flip()
def update_man(man,wall):
    man.update()
    collisions = pygame.sprite.spritecollide(man,wall, True,False)
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
man.py
 
class Man(Sprite):
    def __init__(self,zb_settings,screen):
        super().__init__()
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen
        self.zb_settings = zb_settings
        self.image = pygame.image.load('images/man_down.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.centery = self.screen_rect.centery
        self.center = float(self.rect.centerx)
        self.rect.centerx = self.center
        self.moving_right = False
        self.moving_left = False
        self.moving_up = False
        self.moving_down = False
    def update(self):
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.centerx += self.zb_settings.man_speed_factor
        elif self.moving_left and self.rect.left > 0:
            self.rect.centerx -= self.zb_settings.man_speed_factor
        elif self.moving_up and self.rect.centery > 10:
            self.rect.centery -= self.zb_settings.man_speed_factor
        elif self.moving_down and self.rect.centery < self.screen_rect.bottom - 10:
            self.rect.centery += self.zb_settings.man_speed_factor
    def blitme(self):
        self.screen.blit(self.image, self.rect)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wall.py
import pygame
from pygame.sprite import Sprite
 
class Wall(Sprite):
    def __init__(self,zb_settings,screen):
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen
        self.zb_settings = zb_settings
        self.image = pygame.image.load('images/walls.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.x = 0
        self.rect.y = 0
    def blitme(self):
        self.screen.blit(self.image, self.rect)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
settings.py
class Settings():
    def __init__(self):
        self.screen_width = 693
        self.screen_height = 693
        self.bg_color = (155,155,155)
 
        self.man_speed_factor = 2
 
        self.sleepe = 0.05
 
        self.bullet_h = 10
        self.bullet_w = 2
        self.bullet_color = (60,60,60)
        self.bullet_speed = 1.5
        self.bullet_naprav = 0
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
game.py
import pygame
from pygame.sprite import Group
from settings import Settings
from man import Man
from house import House
from wall import Wall
import game_functions as gf
 
def run_game():
    pygame.init()
    zb_settings = Settings()
    screen = pygame.display.set_mode(
        (zb_settings.screen_width,
        zb_settings.screen_height))
    pygame.display.set_caption("Зомби Атакуют")
    man = Man(zb_settings,screen)
    house = House(zb_settings,screen)
    wall = Wall(zb_settings,screen)
    bullets_right = Group()
    bullets_left = Group()
    bullets_up = Group()
    bullets_down = Group()
    while True:
        gf.check_events(zb_settings,screen,man,bullets_right,bullets_left,
                        bullets_up,bullets_down)
        gf.update_man(man,wall)
        bullets_right.update(zb_settings,bullets_right,bullets_left,
                        bullets_up,bullets_down,3)
        bullets_left.update(zb_settings,bullets_right,bullets_left,
                        bullets_up,bullets_down,1)
        bullets_up.update(zb_settings,bullets_right,bullets_left,
                        bullets_up,bullets_down,2)
        bullets_down.update(zb_settings,bullets_right,bullets_left,
                        bullets_up,bullets_down,0)
        for bullet in bullets_right.copy():
            if bullet.rect.centerx >= 693:
                bullets_right.remove(bullet)
        for bullet in bullets_left.copy():
            if bullet.rect.centerx <= 0:
                bullets_left.remove(bullet)
        for bullet in bullets_up.copy():
            if bullet.rect.centery <= 0:
                bullets_up.remove(bullet)
        for bullet in bullets_down.copy():
            if bullet.rect.centery >= 693:
                bullets_down.remove(bullet)
        gf.update_screen(zb_settings,screen,man,house,wall,bullets_right,bullets_left,
                        bullets_up,bullets_down)
run_game()
P.S могу приложить весь остальной код если понадобится.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.07.2019, 16:44
Ответы с готовыми решениями:

При импорте pygame пишет что нет модуля pygame.base
Устанавливаю для kivy.Всё есть (sython,gsstreamer,kivy,pyscripter,python) , а вот фраем. pygame не работает.Почему?Что ещё надо для работы...

Ошибка в pygame AttributeError: 'pygame.Rect' object has no attribute 'blit'
Создаю игру, крестики нолики Почему возникает ошибка и как ее исправить? AttributeError: 'pygame.Rect' object has no attribute 'blit' ...

Pygame ошибка module ‘pygame’ has no ‘init’ member
Всем здравствуйте. Недавно начал работать с VS code и выдает такая ошибка. Прикрепляю полностью скрин. Нашел решение перед каждой...

1
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
21.07.2019, 20:19
Лучший ответ Сообщение было отмечено Danif как решение

Решение

Цитата Сообщение от Danif Посмотреть сообщение
. Хотел спросить есть ли команда в которой сталкиваются два спрайта?
так

Python
1
pygame.sprite.collide_rect(sprite1, sprite2)
или так

Python
1
sprite1.rect.colliderect(sprite2.rect)
Цитата Сообщение от Danif Посмотреть сообщение
изоображение стены,то коллизии будут происходить на месте есть изоображение стен или по всему изоображению?э
По всему изображению
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2019, 20:19
Помогаю со студенческими работами здесь

pygame.error: cannot convert without pygame.display initialized
Только начал изучать спрайты Выдаёт ошибку: Traceback (most recent call last): File &quot;D:/project1/OCode.py&quot;, line 18, in...

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

Pygame.mixer.music.set_pose() не меняет pygame.mixer.music.get_pose()
Доброго времени суток, друзья! Пишу что-то среднее между часами и музыкальным плеером. Решил, что музыку буду воспроизводить с помощью...

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru