pygame(python) Коллизия

Есть "player"(спрайт) и группа стен(other_group), тоже спрайты. При создании стены с НЕ одинаковыми координатами по x/y, не коректно отрабатывает метод sprite.spritecollide. конкретнее по горизонтали все окей, по вертикали player просто проваливается в стену. пытался переписать с другими методами, результат все тот же. .

# class стены
class Tile(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__(other_group)
        self.image = wall_images
        self.rect = self.image.get_rect().move(x, y)
class Player(pygame.sprite.Sprite):
    def __init__(self, speed, x, y):
        super().__init__(player_group)
        self.speed = speed
        self.frames = []
        self.cur_frame = 0
        self.image = animation_down[0]
        self.rect = self.image.get_rect().move(x, y)
        
    def dorabotat_possibility_move(self, directory_of_movement):
        if directory_of_movement == 'right':
            tester = Player(self.speed, self.rect[0] + self.speed, self.rect[1])
        elif directory_of_movement == 'left':
            tester = Player(self.speed, self.rect[0] - self.speed, self.rect[1])
        elif directory_of_movement == 'up':
            tester = Player(self.speed, self.rect[1] - self.speed, self.rect[0])
        else:
            tester = Player(self.speed, self.rect[1] + self.speed, self.rect[0])

        if pygame.sprite.spritecollide(tester, other_group, dokill=False, collided=pygame.sprite.collide_rect_ratio(0.7)):
            print('collision')
            tester.kill()
            return False
        else:
            return True
#...
player = Player(SPEED, pos_x, pos_y)
tile2 = Tile(264, 264)
tile3 = Tile(264+64, 264)
#...
running = True
while running:
    screen.fill('black')
    for ev in pygame.event.get():
        if ev.type == pygame.QUIT:
            pygame.quit()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and pos_x > 5 and player.dorabotat_possibility_move('left'):
        pos_x -= player.speed
        left = True
        right = down = up =Fals
    elif keys[pygame.K_RIGHT] and pos_x < WIDHT and player.dorabotat_possibility_move('right'):
        pos_x += player.speed
        left = down = up = False
        right = True
    elif keys[pygame.K_UP] and pos_y > 5 and player.dorabotat_possibility_move('up'):
        pos_y -= player.speed
        up = True
        right = left = down = False
    elif keys[pygame.K_DOWN] and pos_y < HEIGHT and player.dorabotat_possibility_move('down'):
        pos_y += player.speed
        left = right = up = False
        down = True
    else:
        left = up = down = right = False
        frame = 0

    for ev in pygame.event.get():
        if ev.type == pygame.QUIT:
            pygame.quit()

    clock.tick(FPS)

    other_group.draw(screen)
    other_group.update()
    player.draw_player()
    pygame.display.update()

full code - https://github.com/ariewhite/Socoban/blob/master/Socoban.py


Ответы (1 шт):

Автор решения: Arie White

не правильно задаются аргументы для tester`a в строке

tester = Player(self.speed, self.rect[1] - self.speed, self.rect[0])

должно быть

tester = Player(self.speed, self.rect[0], self.rect[1] - self.speed)

аналогично для else


ответ взят из stackoverflow

→ Ссылка