Задать вопрос
@meta941

Как исправить коллизию в PyGame?

Итак, ввиду того, что код у меня попросту гигантский(не судите строго, подобное пишу первый раз) - вот ссылка на архив
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 идёт сразу в обе стороны - тогда меня попросту выталкивает в сторону, противоположную моему диагональному направлению.

Я понимаю почему происходит этот баг, но как его исправить - понять не могу...
Пытался посчитать отношение между текущей позицией и прошлой, но где-то просчитался и решил вернуться к тому варианту, что можно лицезреть - наполовину нерабочий.
  • Вопрос задан
  • 81 просмотр
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы