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()