Odbicie się od ściany.

0

Na ekranie jest czerwony kwadrat, którym można sterować z poziomu klawiatury i cztery statyczne prostokąty. Chcę, aby ruch kwadratu przez prostokąt był blokowany.

W kodzie jaki do tej pory zrobiłem wszystko działa tak jak trzeba, ale tylko dla przypadku w którym user trzyma jedną strzałkę. Jeśli zdecyduje się na ruch ukośny wtedy ujawnia się bug. Wiem czemu tak jest z resztą po samym kodzie łatwo to wywnioskować, ale mimo to nie mam pojęcia jak wypada tę sytuację rozwiązać. Chętnie wysłucham radę.

Poniższy kod uruchamia się w momencie zderzenia dynamicznego obiektu(self), z statycznym obiektem(item).

def on_hit(self, item):
    if Direction.Up in self.directions:
        self.y = item.y + item.height
    elif Direction.Down in self.directions:
        self.y = item.y - self.height

    if Direction.Left in self.directions:
        self.x = item.x + item.width
    elif Direction.Right in self.directions:
        self.x = item.x - self.width

Natomiast poniższy fragment ukazuje w jak określam self.directions.

def update_(self, delta_time, keyboard):
    self.directions = []

    if keyboard.get(Qt.Key_Right, False):
        self.x += delta_time * self.v
        self.directions.append(Direction.Right)
    elif keyboard.get(Qt.Key_Left, False):
        self.x -= delta_time * self.v
        self.directions.append(Direction.Left)

    if keyboard.get(Qt.Key_Down, False):
        self.y += delta_time * self.v
        self.directions.append(Direction.Down)
    elif keyboard.get(Qt.Key_Up, False):
        self.y -= delta_time * self.v
        self.directions.append(Direction.Up)
0

Ja bym to zrobił zupełnie inaczej. Zamiast poruszać się i cofać, zrobiłbym w jednej funkcji znalezienie nowej pozycji, a w tej weryfikującej w przypadku zderzenia robiłbym obraz położenia (tak, jakby tam było lustro), lub znalazłbym najbliższą ściany prawidłową pozycję. Wtedy będzie też działało jak nowa pozycja wynika nie tylko z akcji użytkownika (ale np. z wiatru, czy jakiegoś rodzaju bezwładności). Akcje użytkownika najlepiej by było ograniczyć do jak najmniejszego fragmentu programu (ze względu min. na testowanie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1