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

Поділитися
Вставка
  • Опубліковано 29 вер 2024

КОМЕНТАРІ • 91

  • @Panaxet
    @Panaxet 2 роки тому +13

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

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

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

  • @ЛенинГриб-с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 Рік тому

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

  • @vladimirfolomeev5697
    @vladimirfolomeev5697 3 роки тому +1

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

  • @АлексейТверской-д3ъ
    @АлексейТверской-д3ъ 6 місяців тому

    Сделал через 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

  • @TimurAct
    @TimurAct 4 місяці тому +2

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

  • @Olow-pf1di
    @Olow-pf1di 3 роки тому +1

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

  • @ЕвгенийБобынцев-щ9ц

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

  • @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 да, это вопрос...

  • @highgujj
    @highgujj 2 місяці тому +2

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

  • @badishow4807
    @badishow4807 3 роки тому +17

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

    • @Ali-gh1um
      @Ali-gh1um 2 роки тому

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

  • @АлексейИркутский-к8и
    @АлексейИркутский-к8и 6 місяців тому +5

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

  • @eclipsium_msk
    @eclipsium_msk 3 роки тому +12

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

  • @michisato9653
    @michisato9653 4 місяці тому +1

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

  • @ТимурМаренич
    @ТимурМаренич 3 роки тому +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 Рік тому

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

  • @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, саму цифру увидел в комментариях

    • @SennyaPyatnickiy
      @SennyaPyatnickiy Рік тому

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

    • @buga-buga2141
      @buga-buga2141 Рік тому

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

  • @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на момент написания комента тайм кода не было

  • @MrMcgrey
    @MrMcgrey 9 місяців тому +1

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

  • @YbisZX
    @YbisZX 4 роки тому +6

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

    • @span4ev
      @span4ev 2 роки тому

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

  • @t3m8ch79
    @t3m8ch79 3 роки тому +4

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

    • @ОлегТруе
      @ОлегТруе 3 роки тому

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

    • @BATYA1711
      @BATYA1711 2 роки тому

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

  • @АрсенийАсеев-т7щ
    @АрсенийАсеев-т7щ 4 місяці тому +1

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

  • @DUICHMANN
    @DUICHMANN Рік тому +1

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

  • @lololopata
    @lololopata Рік тому +1

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

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

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

  • @катурай
    @катурай 2 місяці тому +1

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

  • @kerill7108
    @kerill7108 2 роки тому +3

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

    • @magnum_fennec
      @magnum_fennec 2 роки тому

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

    • @kerill7108
      @kerill7108 2 роки тому

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

    • @magnum_fennec
      @magnum_fennec 2 роки тому

      @@kerill7108 :)

  • @Краказябра-п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)

  • @Nnycin
    @Nnycin Рік тому +1

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

  • @OlegFantik
    @OlegFantik 2 роки тому +2

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

    • @nicholasspezza9449
      @nicholasspezza9449 2 роки тому +2

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

    • @mute_ys
      @mute_ys 5 місяців тому

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

  • @handyfrontend
    @handyfrontend 3 роки тому +2

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

    • @inside7598
      @inside7598 3 роки тому +2

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

  • @weeqn1967
    @weeqn1967 4 роки тому +2

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

  • @danilisbro3731
    @danilisbro3731 3 роки тому +3

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

    • @selfedu_rus
      @selfedu_rus  3 роки тому

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

    • @ОлегТруе
      @ОлегТруе 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 спасибо, попробую

  • @Kaiden_The_Cat
    @Kaiden_The_Cat 3 роки тому +2

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

  • @codman5389
    @codman5389 3 роки тому +1

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

    • @span4ev
      @span4ev 2 роки тому

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

  • @bfdhtfyjhjj
    @bfdhtfyjhjj 4 роки тому +1

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

  • @happylife2345
    @happylife2345 4 роки тому +2

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

  • @maksimbtw
    @maksimbtw Рік тому +1

    крутой гайд

  • @ОлегГубернатарав
    @ОлегГубернатарав 2 роки тому +1

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

  • @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)

  • @xlebylllek321
    @xlebylllek321 3 роки тому +1

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

  • @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

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

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

  • @Dayplaylist
    @Dayplaylist 2 роки тому +3

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

  • @BloxGaming572
    @BloxGaming572 Рік тому

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

    • @mute_ys
      @mute_ys 5 місяців тому

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

  • @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 5 місяців тому

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

  • @OXYCODONE-m9b
    @OXYCODONE-m9b Рік тому +1

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

  • @CHEATS-MASTER
    @CHEATS-MASTER 2 роки тому +1

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