• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przycinanie się obiektu przy ruchu

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
242 wizyt
pytanie zadane 25 maja 2022 w Python przez kacper1445 Mądrala (5,050 p.)
edycja 25 maja 2022 przez kacper1445

Hej napisałem prosty kodzik w Pythonie z pomocą biblioteki Pygame. Problem leży w tym, że kiedy zaczynam ruszać obiektem, on robi lekki skok i później dopiero idzie płynnie. Dodatkowo jeżeli mam naciśnięte dwa klawisze, np W i D to wszystko idzie okej, natomiast jeżeli puszczę W z dalej przyciśniętym D, to obiekt się zatrzymuje.

import pygame as pg
pg.init()


class Control:
    @staticmethod
    def keys_control():
        for event in pg.event.get():
            if event.type == pg.QUIT:
                raise SystemExit
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    raise SystemExit

            keys = pg.key.get_pressed()
            if keys[pg.K_w]:
                hero.change_pos((0, -5))
            if keys[pg.K_s]:
                hero.change_pos((0, 5))
            if keys[pg.K_a]:
                hero.change_pos((-5, 0))
            if keys[pg.K_d]:
                hero.change_pos((5, 0))


class Hero:
    def __init__(self, pos: tuple):
        image = pg.image.load("hero.png")
        image = pg.transform.scale(image, (100, 100))
        self._surface = image
        self._pos = pos

    def change_pos(self, pos_add: tuple):
        new_pos = (self._pos[0] + pos_add[0], self._pos[1] + pos_add[1])
        self._pos = new_pos

    def get_pos(self):
        return self._pos

    def get_surface(self):
        return self._surface


class Window:
    def __init__(self):
        self._window = pg.display.set_mode()

    def clear(self):
        self._window.fill((0, 0, 0))

    def update_frame(self):
        pg.display.flip()
        self.clear()

    def update_window(self, *to_blit):
        list_to_blit = []

        for el in to_blit:
            tmp = (el.get_surface(), el.get_pos())
            list_to_blit.append(tmp)

        self._window.blits(list_to_blit)




window = Window()
hero = Hero((0, 0))


while True:
    Control.keys_control()
    window.update_window(hero)
    window.update_frame()

 

1 odpowiedź

+1 głos
odpowiedź 25 maja 2022 przez kacper1445 Mądrala (5,050 p.)

Sprawa rozwiązana, wystarczyło w klasie Control, przenieść poza for obsługę ruchu. Kod po naprawie wygląda tak:

 

class Control:
    @staticmethod
    def keys_control():
        for event in pg.event.get():
            if event.type == pg.QUIT:
                raise SystemExit
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    raise SystemExit

        keys = pg.key.get_pressed()
        if keys[pg.K_w]:
            hero.change_pos((0, -5))
        if keys[pg.K_s]:
            hero.change_pos((0, 5))
        if keys[pg.K_a]:
            hero.change_pos((-5, 0))
        if keys[pg.K_d]:
            hero.change_pos((5, 0))

 

Podobne pytania

0 głosów
0 odpowiedzi 142 wizyt
pytanie zadane 23 marca 2020 w Python przez AdiReRe Nowicjusz (190 p.)
0 głosów
2 odpowiedzi 1,997 wizyt
pytanie zadane 2 października 2018 w Python przez niezalogowany
0 głosów
0 odpowiedzi 141 wizyt
pytanie zadane 4 sierpnia 2023 w Python przez Kubas23 Użytkownik (630 p.)

93,432 zapytań

142,428 odpowiedzi

322,661 komentarzy

62,796 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...