Python pygame как изменить коллизии

Я начал изучать питон, а именно библиотеку pygame, тк другу на 1 курсе задали сделать игру.

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

Как я понимаю мне нужно сделать как-то коллизию к примеру 46х47 пикселей и на нее наложить анимации, но я не знаю как это сделать.

Вот конфиг:

GRAVITY = -4
BLOCK_SIZE = 64
PLAYER_S = 128*2
PLAYER_WIDTH = 46
PLAYER_HEIGHT = 47

Вот код класса игрока, переменная GRAVITY = -4:

import pygame as pg
from config import GRAVITY
class Player2:
    def __init__(self,sc,player_images_r,player_images_l):
        self.sc = sc
        self.imgs_r = player_images_r
        self.imgs_l = player_images_l

        self.movement = [0,0]
        self.old_dir = [0,0]
        self.rect = self.imgs_l[0].get_rect()
        self.rect.topleft = [200, 100]
        self.anim_count = 0
        self.is_run = False
        self.delta_time = 0

        #Physics
        self.air_time = 0
        self.is_ground = False
    
    def draw(self):
        self.anim_count %= 500  # Это значение можно оставить, если анимация слишком быстрая
        if self.is_run:
            if self.movement[0] > 0:
                self.sc.blit(self.imgs_r[int(self.anim_count * 0.01) % len(self.imgs_r)], self.rect)  # Увеличьте множитель до 0.01
            if self.movement[0] < 0:
                self.sc.blit(self.imgs_l[int(self.anim_count * 0.01) % len(self.imgs_l)], self.rect)  # Увеличьте множитель до 0.01
        else:
            if self.old_dir[0] > 0:
                self.sc.blit(self.imgs_r[0], self.rect)
            elif self.old_dir[0] < 0:
                self.sc.blit(self.imgs_l[0], self.rect)

    def update(self,delta_time, blocks):
        self.delta_time = delta_time
        self.change_dir()
        self.anim_count += delta_time
        
        self.physics(blocks)

    def change_dir(self):
        keys = pg.key.get_pressed()
        if keys[pg.K_a]:
            self.movement[0] = -1
        elif keys[pg.K_d]:
            self.movement[0] = 1
        else:
            if self.movement[0] != 0:
                self.old_dir[0] = self.movement[0]
            self.is_run = False
            self.movement[0] = 0
        if self.movement[0] != 0:
            self.is_run = True

    
    def get_jump(self):
        keys = pg.key.get_pressed()
        if keys[pg.K_SPACE]: 
            return True
        return False
    
    def physics(self, blocks):
        self.air_time += -self.delta_time * 0.001
        self.movement[1] = GRAVITY * self.air_time
        self.rect.x += self.movement[0] * self.delta_time
        collide = self.get_collision(blocks)
        for col in collide:
            if self.movement[0] > 0:
                self.rect.right = col.left
            elif self.movement[0] < 0:
                self.rect.left = col.right

        self.rect.y += self.movement[1] * self.delta_time
        collide = self.get_collision(blocks)
        for col in collide:
            if self.movement[1] > 0:
                self.rect.bottom = col.top
                self.is_ground = True
            elif self.movement[1] < 0:
                self.rect.top = col.bottom
        if self.is_ground:
            self.air_time = 0
            if self.get_jump():
                self.air_time = 0.3
        self.is_ground = False

    
    def get_collision(self, blocks):
        collide = []
        for col in blocks:
            if self.rect.colliderect(col):
                collide.append(col)
        return collide

Вот код main.py:

import pygame as pg
from тест import Player2
from config import *
RES = WIDTH, HEIGHT = 800*2,500*2

pg.init()
sc = pg.display.set_mode(RES)
clock = pg.time.Clock()

FPS = 60
PLAYER_SIZE = PLAYER_S,PLAYER_S
player_image_r = [pg.transform.scale(pg.image.load(f"z1/run_{i}.png"), PLAYER_SIZE) for i in range(1, 9)]
player_image_l = [pg.transform.flip(img, True, False) for img in player_image_r]

player = Player2(sc, player_image_r, player_image_l)

background = pg.image.load("Assets/bimage2.png")
background = pg.transform.scale(background,RES)
block_image = pg.transform.scale(pg.image.load("Assets/block.png"),(BLOCK_SIZE, BLOCK_SIZE))
blocks = [pg.Rect((-200+i*BLOCK_SIZE,400),(BLOCK_SIZE,BLOCK_SIZE)) for i in range(15)]
blocks.extend([pg.Rect((400, 300+i*BLOCK_SIZE),(BLOCK_SIZE,BLOCK_SIZE)) for i in range(3)])
blocks.extend([pg.Rect((600, 208+i*BLOCK_SIZE),(BLOCK_SIZE,BLOCK_SIZE)) for i in range(3)])

while True:
    delta_time = clock.tick(FPS)
    sc.blit(background,(0,0))

    for ev in pg.event.get():
        if ev.type == pg.QUIT:
            exit()
    player.update(delta_time, blocks)
    player.draw()
    [sc.blit(block_image,blocks[i]) for i in range(21)]

    pg.display.update()


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