Как обрабатывать события от клавиатуры | Pygame #3

Поделиться
HTML-код
  • Опубликовано: 13 янв 2025

Комментарии • 92

  • @Panaxet
    @Panaxet 2 года назад +13

    Спасибо за такой замечательный курс! Даже знаний этих трех уроков мне хватило для создания простой 3D игры на технологии ray casting!

  • @АлександрЛобов-ъ1н

    Автору респект и восхищение. Великолепная подача материала.

  • @badishow4807
    @badishow4807 3 года назад +18

    Здравствуйте, мне бы хотелось сказать несколько слов о вашем курсе по "Pygame"
    1) Искренне вас благодарю за его создание. Этот курс мне помог подтянуть мои знания в языке программирования "Python", а также облегчил изучение модуля.
    2) 2-ой способ обработки событий, который вы показали, кроме того, что легче, так ещё не забагованый (В 1-ом случае имеются проблемы с управлением. Они заметнее всего в Bullethell'ax)

    • @Ali-gh1um
      @Ali-gh1um 2 года назад

      ну и как успехи?

  • @rioriocccp5929
    @rioriocccp5929 Год назад +5

    0:18 модуль отвечающий за обработку событий
    0:25 метод get()
    0:32 событие, объект Event
    0:40 свойство type
    1:00 клавиша нажата, клавиша отпущена, KEYDOWN, KEYUP
    1:28 пример
    2:32 KEYDOWN в коде, событие клавиша нажата
    2:48 определяем какая клавиша нажата
    3:49 как работает пример
    4:02 не реагирует на длительное зажатие клавиши
    4:33 причина
    5:08 делаем перемещение прямоугольника при зажатой клавиши, вариант 1
    6:43 как работает вариант 1
    7:07 вариант 2, теория
    8:15 удаляем старый код
    8:25 варианта 2, код
    8:58 как работает вариант 2
    9:12 что делает get_pressed()
    9:31 ctrl + стрелка не работает в get_pressed
    9:46 причина
    9:54 отслеживаем нажатие клавиш модификаторов (shift, ctrl, alt)
    11:34 как работает перемещение с ctrl

    • @grovestreet2126
      @grovestreet2126 Год назад

      в видео есть тайм-коды, нахера сюда добавлять?

    • @rioriocccp5929
      @rioriocccp5929 Год назад

      ​@@grovestreet2126на момент написания комента тайм кода не было

  • @катурай
    @катурай 5 месяцев назад +1

    Это действительно лучший канал с видеоуроками из всех, которые я видел. Спасибо большое за то, что делаете!

  • @eclipsium_msk
    @eclipsium_msk 3 года назад +12

    Лучший гайдлайн библиотеки на русском. Красавчик :D

  • @АлександрЯчменев-э2я

    как всегда лучшая обучалка,(я делаю коменты чтобы дополнить автора потому что мне его обучалки очень нравятся)
    есть небольшая разница первого и второго варианта
    в 1 варианте проверяется отпускание любой из клавиш, то есть если держим лево и нажали в право и за 1/60 секунды не успели отпустить лево то квадратик встанет хотя кнопка в право нажата, условия ступора отпускание любой из клавиш, исправление бага это прописать отпускания отдельно,
    во 2 варианте проверка нажатой клавиши через elif а значит 1 условие не даст второму никогда свершиться, то есть если нажали лево то пойдем в лево даже если нажали еще и в право, а если отпустили влево и при этом нажата вправо то пойдем в право,
    то есть при одновременно нажатых клавишах приоритет будет первое условие,
    исправление бага elif заменить на if тогда при обеих нажатых клавишах кубик встанет так как x прибавит и вычтет до отрисовки,
    сответственно при быстром нажатии лево право движение будет корректным.

  • @ТимурМаренич
    @ТимурМаренич 4 года назад +6

    Если ктото захочет сделать зажатие клавиши более большим способом (я думаю такие люди есть) то у этого кода что в видео есть маленький недочет. когда ты нажмешь одну клавишу (К_a), а затем не отпуская нажмешь другую (К_d) и отпустишь первую (К_a) твой персонаж никуда не пойдет. это повлияет на ощущение и управление будет непривычным. чтобы это изменить достаточно эту команду:
    elif event.type == pg.KEYUP:
    if event.key in [pg.K_a, pg.K_d]:
    fleft = fright = False
    поменять на эту:
    elif event.type == pg.KEYUP:
    if event.key == pg.K_a:
    fleft = False
    if event.key == pg. K_d:
    fright = False

    • @15x3
      @15x3 Год назад

      Чел, спасибо.

  • @weeqn1967
    @weeqn1967 4 года назад +2

    Довольно доступно и понятно. Очень жду следующие видео!

  • @TimurAct
    @TimurAct 8 месяцев назад +2

    3:52 Не работает. Прямоугольник не двигается.Зделал все как надо. Но нет.

  • @Dayplaylist
    @Dayplaylist 2 года назад +3

    Подтверждаю что это лучший урок на русском о pygame😌👍 огромное спасибо

  • @Kaiden_The_Cat
    @Kaiden_The_Cat 4 года назад +2

    Круто объясняешь

  • @vladimirfolomeev5697
    @vladimirfolomeev5697 3 года назад +1

    Спасибо за урок!

  • @АлексейИркутский-к8и
    @АлексейИркутский-к8и 10 месяцев назад +5

    У меня игровой персонаж вообще не перемещается, не реагирует на нажатие клавиш.

  • @АрсенийАсеев-т7щ
    @АрсенийАсеев-т7щ 7 месяцев назад +1

    Спасибо, очень помогло

  • @happylife2345
    @happylife2345 4 года назад +2

    Супер! Спасибо!

  • @ВикторЧеботарь-з2в

    спасибо за занятие)

  • @buga-buga2141
    @buga-buga2141 2 года назад +6

    Привет. Спасибо большое за урок, все круто, но только с левым контрол не работает, как по видео
    Я прописал вот так: if event.key == pygame.K_LEFT and event.mod == 4160:
    но не пойму в чем разница, и почему нужно писать именно 4160?

    • @selfedu_rus
      @selfedu_rus  2 года назад

      да, не только у вас так, может или особенности ОС (у меня Windows 10) или версия поменялась

    • @buga-buga2141
      @buga-buga2141 2 года назад

      @@selfedu_rus , у меня win 11 стоит, наверно поэтому. Только я не совсем понимаю, откуда взялись именно такие цифры, обозначающие клавишу ctrl, саму цифру увидел в комментариях

    • @IPyatnickiy
      @IPyatnickiy Год назад

      Извините, вы так и не разобрались откуда взять данные цифры? я ничего нагуглить не могу по кодам клавиш в виндовс

    • @buga-buga2141
      @buga-buga2141 Год назад

      @@IPyatnickiy , только так, как прописал в комменте, больше ничего не гуглил

  • @maksimbtw
    @maksimbtw Год назад +1

    крутой гайд

  • @michisato9653
    @michisato9653 8 месяцев назад +1

    У меня произошло что то странное почему то при перемещении прямоугольника он оставляет за собой "след" превращаясь в полосу на экране

  • @t3m8ch79
    @t3m8ch79 4 года назад +4

    Попробовал написать пример программы, которая использует ctrl, но она не работала. Оказалось, если отнять от event.mod число 4096 и получившееся выражение сравнить с KMOD_LCTRL, то всё работает. Тоже самое и с Shift. В чём дело?

    • @ОлегТруе
      @ОлегТруе 3 года назад

      О, круто! Спасибо за найденное решение. По всей видимости код из библиотеки KMOD_LCTRL не всегда совпадает со значением event.mod.
      Ещё можно event.mod делить с получением остатка на 4096: event.mod % 4096
      Зависит наверное от операционной системы. Хотя может быть тут дело в версии pygame или python.

    • @BATYA1711
      @BATYA1711 2 года назад

      лучший спасибо

  • @YbisZX
    @YbisZX 4 года назад +6

    Странно, что управляющие кнопки не включают в кортеж. Почему так, интересно... Насколько проще было бы все.

    • @span4ev
      @span4ev 2 года назад

      возможно (весьма возможно), что дело в том, как пайтон обращается к памяти компьютера и какие значения используются для обработки клавиш. Но я это так - просто пукнул невежеством.

  • @xlebylllek321
    @xlebylllek321 3 года назад +1

    Спасибо большое

  • @Nnycin
    @Nnycin 2 года назад +1

    Что если никакой вариант кода не работает? Это может быть связано с тем что выше кода движения у меня прописано добавление как спрайта картинку .png? У меня Linux Mint 19.4, IDEL , Python 3.6. Спрайт отрисованнный просто стоит, а ошибок не выдает.

  • @Краказябра-п3щ
    @Краказябра-п3щ Год назад +1

    было очень неудобно в такой системе координат решил переопределить))
    def rect(color, coords_xy, size_xy, width = 0):
    pygame.draw.rect(SURFACE, color, ((coords_xy[0], height - coords_xy[1]- size_xy[1]), (size_xy)), width)

  • @ОлегГубернатарав
    @ОлегГубернатарав 2 года назад +1

    спасибо помог.

  • @handyfrontend
    @handyfrontend 3 года назад +2

    Здравствуйте! Я ввел всё как показано на видео, но на деле просто черный экран... Что делать?

    • @inside7598
      @inside7598 3 года назад +2

      установил модуль pygame?

  • @ЛенинГриб-с3ю
    @ЛенинГриб-с3ю 3 года назад +7

    import pygame
    import sys
    #все нужные переменные
    x = 200
    y = 200
    speed = 5
    WIDTH = 500
    HEIGHT = 500
    FPS = 30
    stena = True
    right = False
    left = False
    up = False
    down = False
    WHITE = (255,255,255)
    YELLOW = (255,255,0)
    BLACK = (0,0,0)
    RED = (255,0,0)
    GREEN = (0,255,0)
    BLUE = (0,0,255)
    BERUZA = (0,255,255)
    PURPUR = (255,0,255)
    nada = YELLOW
    #все нужные переменные
    pygame.mixer.init()
    pygame.init()
    screen = pygame.display.set_mode((WIDTH,HEIGHT))
    def xz():
    global x
    global y
    global nada
    t = pygame.Rect(x,y,20,20)
    pygame.draw.rect(screen,(nada),t,0)
    if x > WIDTH:
    x = WIDTH - WIDTH
    nada = WHITE
    if x < WIDTH - WIDTH:
    x = WIDTH
    nada = GREEN
    if y > HEIGHT:
    y = HEIGHT - HEIGHT
    nada = BLUE
    if y < HEIGHT - HEIGHT:
    y = HEIGHT
    nada = PURPUR
    pygame.display.set_caption("пишите что угодно")
    clock = pygame.time.Clock()
    run = True
    while run:
    clock.tick(FPS)
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()
    run = False
    if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_w:
    up = True
    if event.key == pygame.K_s:
    down = True
    if event.key == pygame.K_a:
    left = True
    if event.key == pygame.K_d:
    right = True
    if event.type == pygame.KEYUP:
    if event.key == pygame.K_w:
    up = False
    if event.key == pygame.K_s:
    down = False
    if event.key == pygame.K_a:
    left = False
    if event.key == pygame.K_d:
    right = False
    if stena == True:
    if up == True:
    y = y - speed
    if down == True:
    y = y + speed
    if left == True:
    x = x - speed
    if right == True:
    x = x + speed
    screen.fill(BERUZA)
    xz()

    pygame.display.flip()
    pygame.quit()
    Это чисто мой код, если хотите то пользуйтесь.

    • @Nnycin
      @Nnycin 2 года назад

      спасибо, у меня не работала часть с движением и я использовала сначало 3 кода из видео - ничего а потом твой код, но сработала только часть с закрытием окна. У меня там спрайт в виде png но он просто не двигаеться даже ошибок не выдает. Может поможете? Если что у меня Linux Mint 19.4 пишу в IDEL на Python 3.6

  • @ЕвгенийБобынцев-щ9ц
    @ЕвгенийБобынцев-щ9ц 4 месяца назад

    Передвижение работает квадрат ннарисован но заним идет след что делать

  • @danilisbro3731
    @danilisbro3731 4 года назад +3

    Странно, у меня не работает с клавишей LCtrl

    • @selfedu_rus
      @selfedu_rus  4 года назад

      мне сложно сказать почему, попробуйте продебажить этот момент, посмотрите из-за чего именно не срабатывает

    • @ОлегТруе
      @ОлегТруе 3 года назад

      У меня тоже не работает.

    • @buga-buga2141
      @buga-buga2141 2 года назад +1

      @@ОлегТруе , if event.key == pygame.K_LEFT and event.mod == 4160:

    • @buga-buga2141
      @buga-buga2141 2 года назад +1

      if event.key == pygame.K_LEFT and event.mod == 4160:

    • @ОлегТруе
      @ОлегТруе 2 года назад +2

      @@buga-buga2141 спасибо, попробую

  • @Andre-e9e9r
    @Andre-e9e9r 3 года назад +1

    Спасибо за уроки. Кто ни-будь, скажите(дайте ссылку), как нормализовать движение по диагонали?

    • @freeengineering4120
      @freeengineering4120 3 года назад

      А
      x = W // 2
      y = H // 2
      ...
      keys = pygame.key.get_pressed()
      if keys[pygame.K_LEFT] and keys[pygame.K_DOWN]:
      x -= speed
      y += speed
      ...
      Не получается?

    • @coolrash
      @coolrash 2 года назад

      ты серьезно не можешь это ебучий квадратик поднять вверхъ?

    • @coolrash
      @coolrash 2 года назад

      ты еще не видел настоящий код игры, где нужно entity manager, abstract game object, rooms system, animation manager... particle system да че уж там, пацан не может присвоить координат y

  • @АлексейТверской-д3ъ
    @АлексейТверской-д3ъ 9 месяцев назад

    Сделал через LCtrl именно так(Знак амперсанта важен! - &(шифт + 7)):
    elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    if pygame.key.get_mods() & pygame.KMOD_LCTRL:
    move -= speed
    elif event.key == pygame.K_RIGHT:
    if pygame.key.get_mods() & pygame.KMOD_LCTRL:
    move += speed

  • @kerill7108
    @kerill7108 3 года назад +3

    Кто знает, почему у меня прямоугольник не двигается, а дублируется на новые координаты

    • @magnum_fennec
      @magnum_fennec 2 года назад

      нужно прошлый прямоугольник стирать

    • @kerill7108
      @kerill7108 2 года назад

      @@magnum_fennec я уже разобрался, но всё равно спасибо)

    • @magnum_fennec
      @magnum_fennec 2 года назад

      @@kerill7108 :)

  • @freeengineering4120
    @freeengineering4120 3 года назад +1

    Подскажите пожалуйста, с чем может быть связано: константа pygame.KMOD_LCTRL равна 128, но у меня на компе левый контрол определяется как 4160, и конечно код не срабатывает, если не написать: event.mod == 4160

    • @selfedu_rus
      @selfedu_rus  3 года назад

      По названию - это левый Ctrl

    • @freeengineering4120
      @freeengineering4120 3 года назад

      @@selfedu_rus По названию, да. Но коды клавишь не совпадают почему-то. Другие клавиши-модификаторы не смотрел.

    • @selfedu_rus
      @selfedu_rus  3 года назад

      @@freeengineering4120 да, это вопрос...

  • @codman5389
    @codman5389 3 года назад +1

    можно не использовать флаги и pygame.KYEUP если if запихнуть не в цикл for, а за него, тогда кубик будет идти вправо или влево де тех пор пока ты не отпустишь

    • @span4ev
      @span4ev 2 года назад

      но в цикле for проверяется очередь всех событий в pg.event.get(), и мы отслеживаем изменение событий. Судя по всему, ваш вариант предлагает бесконечное движение без возможности остановиться

  • @MrMcgrey
    @MrMcgrey Год назад +1

    Ну не знаю, для меня все эти проверки контр интуитивные.

  • @OlegFantik
    @OlegFantik 3 года назад +2

    Я ввёл как показано, никакого синего квадрата, и модуль пайгейм у меня есть.

    • @nicholasspezza9449
      @nicholasspezza9449 3 года назад +2

      удались, лолка, все работает

    • @mute_ys
      @mute_ys 8 месяцев назад

      ты флипнул или апдейтнул экран? display.update()

  • @BloxGaming572
    @BloxGaming572 2 года назад

    Что делать если всегда экран черный помогите пожалуйста

    • @mute_ys
      @mute_ys 8 месяцев назад

      ты флипнул или апдейтнул экран? display.update()

  • @danilkatkov6655
    @danilkatkov6655 2 года назад +1

    сделал все как в видео но не работает

    • @selfedu_rus
      @selfedu_rus  2 года назад

      возможно, из-за изменений версий

    • @xxailetx2028
      @xxailetx2028 Год назад

      вместо elif поставь if
      import pygame #импортируем библиотеку
      flLeft = flRight = flUp = flDown = False
      pi = 3,14
      RED = (255, 0, 0) #обьявим цвет
      BLUE = (0, 0, 255)
      GREEN = (0, 255, 0)
      WHITE = (255, 255, 255)
      W = 500
      H = 500
      x = W // 2
      y = H // 2
      speed = 5
      pygame.init()
      #область = pygame.Дисплей.размер ((ширина, высота), pygame.Тип окна)
      sc = pygame.display.set_mode((W, H), pygame.RESIZABLE)
      pygame.display.set_caption("Жабы вперёд!") # ставим название
      clock = pygame.time.Clock()
      FPS = 60
      while 1:
      for event in pygame.event.get():
      if event.type == pygame.QUIT:
      exit()
      if event.type == pygame.KEYDOWN:
      if event.key == pygame.K_ESCAPE:
      exit()
      if event.type == pygame.KEYDOWN:
      if event.key == pygame.K_LEFT:
      flLeft = True
      if event.key == pygame.K_RIGHT:
      flRight = True
      if event.key == pygame.K_UP:
      flUp = True
      if event.key == pygame.K_DOWN:
      flDown = True
      if event.type == pygame.KEYUP:
      if event.key in [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]:
      flLeft = flRight = flUp = flDown = False
      if flLeft:
      x -= speed
      if flRight:
      x += speed
      if flUp:
      y -= speed
      if flDown:
      y += speed
      sc.fill(WHITE) # цвет области на белый
      pygame.draw.rect(sc, 'black', (x, y, 10, 20))
      pygame.display.update()
      clock.tick(FPS)

  • @bfdhtfyjhjj
    @bfdhtfyjhjj 4 года назад +1

    Найс. Го некст.

  • @highgujj
    @highgujj 6 месяцев назад +2

    очень бесит, что ты просто вставляешь код из-за чего я не могу правильно написать его

  • @budddwyer6680
    @budddwyer6680 Месяц назад

    лее че за курсор такой

  • @DUICHMANN
    @DUICHMANN Год назад +1

    Я странно воспринимаю твой голос

  • @lololopata
    @lololopata Год назад +1

    скреч на максимум

  • @OXYCODONE-m9b
    @OXYCODONE-m9b 2 года назад +1

    у меня почему то при использовании pygame.key.get_pressed() прямоугольник двигается только при нажатии на клавишу, но не при удерживании

  • @kamikazekot
    @kamikazekot 2 года назад +1

    спасибо за курс, но у меня квадрат оставляет следы(( что делать?
    вот код:
    import pygame
    pygame.init()
    W = 640
    H = 400
    screen = pygame.display.set_mode((W, H))
    clock = pygame.time.Clock()
    x = W // 2
    y = H // 2
    l = r = False
    speed = 1
    while True:
    for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    l = True
    if event.key == pygame.K_RIGHT:
    r = True
    elif event.type == pygame.KEYUP:
    if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
    l = r = False
    if l:
    x -= speed
    elif r:
    x += speed
    pygame.draw.rect(screen, (255, 255, 0), (x, y, 10, 20))
    pygame.display.update()
    clock.tick(60)

    • @mute_ys
      @mute_ys 8 месяцев назад

      тут надо удалить предыдущий квадрат, тут это делается заливкой экрана sc.fill(ргб или переменная ргб)

  • @CHEATS-MASTER
    @CHEATS-MASTER 2 года назад +1

    а не проще было использовать pygame.quit()

  • @Olow-pf1di
    @Olow-pf1di 3 года назад +1

    спасибо большое