Итак, ввиду того, что код у меня попросту гигантский(не судите строго, подобное пишу первый раз) - вот ссылка на архив
https://disk.yandex.ru/d/_hxmverIV4d4tA
Но, если кто-то сможет понять проблему чисто по скрипту игрока - вот и скрипт игрока собственной персоной:
from settings_and_libs import *
from Drawable import Drawable
from Updated import Updated
from Collidable import Collidable
from globals import get_axis
class Player(pg.sprite.Sprite, Drawable, Updated, Collidable):
def __init__(self, surface: pg.Surface, pos: tuple, size=40, img_path: str = "", drawable_list=None,
updated_list=None, collidable_list=None):
pg.sprite.Sprite.__init__(self)
Drawable.__init__(self, surface, drawable_list)
Updated.__init__(self, updated_list=updated_list)
Collidable.__init__(self, collidable_list)
self.rect = pg.rect.Rect(0, 0, size, size) # This attribute is located inside Drawable class
self.rect.center = pos
self.self_surface = pg.Surface((size, size))
# Called in object of App class in __running method
def get_update(self, elapsed_time):
self.move(elapsed_time)
# Called in object of App class in __running method
# For details, read the comment in the description of the Drawable class
def draw(self):
pg.draw.rect(self.to_surface, pg.Color("red"), self.rect)
def collide(self, collidable_list, elapsed_time):
next_rect = self.rect.copy()
next_rect.move_ip(self.direction[0] * elapsed_time, self.direction[1] * elapsed_time)
hit_list = self.rect.collidelistall([i for i in collidable_list])
if hit_list != [0]:
for hit_index in hit_list:
if self.direction[1] > 0:
self.rect.bottom = collidable_list[hit_index].rect.top
elif self.direction[1] < 0:
self.rect.top = collidable_list[hit_index].rect.bottom
if self.direction[0] > 0:
self.rect.right = collidable_list[hit_index].rect.left
elif self.direction[0] < 0:
self.rect.left = collidable_list[hit_index].rect.right
def move(self, elapsed):
keys = pg.key.get_pressed()
self.direction[0] = get_axis(keys[pg.K_a], keys[pg.K_d])
self.direction[1] = get_axis(keys[pg.K_w], keys[pg.K_s])
self.rect.left += self.direction[0] * elapsed
self.rect.top += self.direction[1] * elapsed
direction = [0, 0]
gravity = 0.01
velocity = pg.math.Vector2(0, gravity)
self_surface: pg.Surface
Проблема: коллизия работает для всех сторон просто замечательно, но...
Если direction идёт сразу в обе стороны - тогда меня попросту выталкивает в сторону, противоположную моему диагональному направлению.
Я понимаю почему происходит этот баг, но как его исправить - понять не могу...
Пытался посчитать отношение между текущей позицией и прошлой, но где-то просчитался и решил вернуться к тому варианту, что можно лицезреть - наполовину нерабочий.