PyGame collide_rect обнаруживает несуществующее столкновение - PullRequest
0 голосов
/ 22 февраля 2019

Я все еще довольно плохо знаком с Pygame и программированием в целом.Я делаю игру, которая требует обнаружения столкновений, и у меня, похоже, с этим проблемы.Каждый раз, когда я запускаю свою программу, она обнаруживает несуществующие коллизии.Вот некоторые фрагменты из моего кода:

class Player(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
    pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.right = False
        self.left = False
        self.up = False
        self.down = False
        self.surf = pygame.Surface((50,50))
        self.rect = self.surf.get_rect()

    def draw(self):
        pygame.draw.rect(screen, (0,0,0), (self.x, self.y, self.width, self.height))

    def collision_test(self):
        if pygame.sprite.collide_rect(self, block1):
            print("a collision is detected")

Выше приведен мой класс игрока.

class Block1(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.surf = pygame.Surface((self.width,self.height))
        self.rect = self.surf.get_rect()

    def draw(self):
        pygame.draw.rect(screen, (150,150,150), (self.x, self.y, self.width, self.height))

И это мой класс для препятствия, с которым должен столкнуться мой игрок.Я запускаю команду печати в обнаружении столкновений для отладки.Как я уже сказал, он просто постоянно печатает сообщение, которое я ему дал, даже когда они не сталкиваются.Там нет сообщений об ошибках, хотя.Любая помощь будет оценена!Заранее спасибо:)

EDIT:

Я изменил метод collision_test и добавил аргумент block1.Теперь это так:

    def collision_test(self, block1):
        if pygame.sprite.collide_rect(self, block1):
            print("a collision is detected")

Мои спрайты player и block1 запускаются непосредственно перед основной лупой и выглядят так:

player = Player(50,50,50,50)
block1 = Block1(200, 200, 100, 100)

Я вызываю функцию collision_test наконец основной петли.Если вам это нужно, вот мой полный код: https://pastebin.com/LTQdLMuV

1 Ответ

0 голосов
/ 22 февраля 2019

Случается так, что вы забыли обновить положение прямоугольников ваших объектов.

Из Pygame Docs :

get_rect ()
получить прямоугольную область поверхности
get_rect (** kwargs) -> Rect
Возвращает новый прямоугольник, покрывающий всю поверхность. Этот прямоугольник всегда будет начинаться с 0, 0 с ширины.и высота соответствует размеру изображения.

В обоих классах Player и Block1 у вас есть строка:

self.rect = self.surf.get_rect()

Для использования colliderect()атрибут rect должен быть обновлен до положения (в пикселях) изображения на экране, в противном случае существует несоответствие между координатами, используемыми вашим методом draw(), и прямоугольником, используемым для проверки столкновений.Сделайте вместо этого:

self.rect = self.surf.get_rect().move(x, y)

, чтобы при создании объекта атрибут rect соответствовал реальной позиции объекта на экране.

Не забудьте обновить позициюplayer.rect при перемещении игрока в клетку.Отредактируйте также функцию move_player(), например, добавив:

player.rect.x = player.x
player.rect.y = player.y

, чтобы rect соответствовало тому, что у вас на экране.

РЕДАКТИРОВАТЬ после комментариев

Если ваша цель , как предотвратить или перекрыть поверхности , это будет сложнее.Обнаружение столкновения - это только часть процесса.Полные шаги:

  • перемещение объекта игрока.
  • обнаружение не только в случае столкновения, но и сторон, которые столкнулись.
  • однажды сторонаобнаружено, переместите объект игрока на эту ось.
  • перерисовать.
...