Как обрабатывать события от мыши | Pygame #4

Поділитися
Вставка
  • Опубліковано 15 січ 2025

КОМЕНТАРІ • 63

  • @kocunys180
    @kocunys180 6 місяців тому +2

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

  • @vivacuba1990
    @vivacuba1990 4 роки тому +8

    Спасибо! Столько труда вложено и времени...

  • @rioriocccp5929
    @rioriocccp5929 Рік тому +3

    0:05 типы событий мыши
    0:14 пример события нажатие кнопки мыши, MOUSEBUTTONDOWN
    0:56 событие MOUSEBUTTONDOWN в коде
    1:15 как работает пример
    1:44 варианты номера нажатой кнопки, event.button
    1:57 событие перемещение курсора мыши, MOUSEMOTION
    2:36 дополнительные свойства у объекта Event
    3:14 когда использовать свойство rel
    3:27 rel существует только для события движение мыши
    4:00 рисуем прямоугольник мышкой
    4:15 переменные
    4:35 событие нажата левая кнопка мыши
    5:12 событие перемещение мыши
    5:55 событие отпущена левая кнопка мыши
    6:25 как работает программа
    6:57 нюанс, событие срабатывает один раз
    7:29 нюанс, событие срабатывает много раз
    7:50 если надо постоянно определять нажата ли кнопка мыши
    8:10 что возвращает функция get_pressed()
    8:39 подготовка кода к добавлению get_pressed
    9:16 get_pressed в коде
    10:30 как работает пример
    11:06 скрыть курсор мыши
    11:37 рисуем свой курсор мыши
    12:13 определяем находится ли курсор мыши в клиентской области окна, функция get_focused()
    12:58 как работает пример

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

      С описания скопировал

  • @lyalyalya2282
    @lyalyalya2282 2 роки тому +1

    спасибо Сергею Балакиреву за курс!

  • @ТарасСандул-э8л
    @ТарасСандул-э8л 2 роки тому +30

    Для тех, у кого не рисует при отрицательной ширине либо высоте (при движении курсора влево или вверх от начальной точки) - вот простой способ решения (ИМХО предложенные в комментариях способы слишком громостки):
    if flStartDraw:
    pos = event.pos
    x, y = min(sp[0], pos[0]), min(sp[1], pos[1])
    width = max(pos[0], sp[0]) - x
    height = max(pos[1], sp[1]) - y
    sc.fill(WHITE)
    pygame.draw.rect(sc, RED, pygame.Rect(x, y, width, height))
    pygame.display.update()

    • @kolyancat
      @kolyancat 2 роки тому +1

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

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

      Написал код в видео. Не работает! Сам разобрался всё исчертил, исписал.
      Заработало. Захожу в коменты и тут такой же код😓😓

    • @highgujj
      @highgujj 6 місяців тому +1

      спасибо! а то у автора мозгов не хватило

    • @EigenGrauGD
      @EigenGrauGD 3 місяці тому

      А со вторым вариантом как применить этот код?

  • @vasyanyanya
    @vasyanyanya 2 місяці тому

    огромное спасибо🎉🎉🎉🎉 я начал понимать 🔥🔥🔥🔥

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

    Cпасибо,очень хорошо объясняешь очень четко и понятно

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

    pygame + логика , отличная тема

  • @АдамусФилида-л2и
    @АдамусФилида-л2и 3 роки тому +3

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

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

    Друзья, чтобы прямоугольник рисовался как слева направо, так и справа налево, необходимо добавить дополнительное условие, которое будет высчитывать новые координаты.
    Нужно по иксу изменить координаты в минус. И потом добавить начальную координату в функцию draw, чтобы оттуда начался рисоваться прямоугольник. Вот код.
    if sp is None:
    sp = pos
    width = pos[0] - sp[0]
    height = pos[1] - sp[1]
    pygame.draw.rect(screen, GREEN, (sp[0], sp[1], width, height))
    if pos[0] - sp[0]

  • @user-matiza
    @user-matiza 4 роки тому +3

    Спасибо.

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

    Спасибо! Ниже код для тех, у кого рисует только в четвертой четверти. И плюс возможность сохранять уже нарисованные прямоугольники.
    import pygame as pg
    pg.init()
    scr = pg.display.set_mode((850, 700))
    clock = pg.time.Clock()
    sp = rect = None
    drawed = list()
    scr.fill((0, 0, 0))
    pg.display.update()
    while True:
    clock.tick(60)

    for e in pg.event.get():
    if e.type == pg.QUIT:
    exit()
    elif e.type == pg.MOUSEBUTTONUP and e.button == 1:
    drawed.append(rect)
    sp = rect = None

    mouse = pg.mouse.get_pressed()
    if mouse[0]:
    if not sp:
    sp = pg.mouse.get_pos()
    rect = pg.Rect(sp[0], sp[1], 0, 0)
    ep = pg.mouse.get_pos()
    rect.x = min(sp[0], ep[0])
    rect.y = min(sp[1], ep[1])
    rect.w = abs(ep[0] - sp[0])
    rect.h = abs(ep[1] - sp[1])

    scr.fill((0, 0, 0))
    pg.draw.rect(scr, (255, 0, 0), rect)
    if drawed:
    for r in drawed:
    pg.draw.rect(scr, (255, 0, 0), r)
    pg.display.update()

  • @暗号化
    @暗号化 Рік тому

    Спасибо за видео

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

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

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

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

  • @andrewbelikov8772
    @andrewbelikov8772 2 роки тому +1

    Грамотно!

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

    спасибо!+++++++++++++++++++++++++

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

    Видео отличное, но хотелось бы что-нибудь по типу "домашнего задания". Допустим, после это урока попробуйте сделать курсор квадратом или рисовать не прямоугольник, а круг...

    • @АлексейСергиевский-в6й
      @АлексейСергиевский-в6й 4 роки тому

      Привет, с тобой согласен, но коли нет заданий то у меня есть предложение, а давай змейку нарисуем?, самую простую из квадратиков, по мне информации изложенной в четырех занятиях достаточно, Либо можно Крестики Нолики.

    • @Mralex22801
      @Mralex22801 4 роки тому +7

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

  • @June_sun_day
    @June_sun_day 4 роки тому +8

    Уроки супер! Только у меня вопрос один. Код написан такой же, но прямоугольник рисуется только слева направо вниз. Вверх не рисуется, справа налево не срабатывает. В чем может быть причина?

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

      Странно, все проверял, да и видео тогда бы не смог снять, если бы было иначе... может версия Pygame как то влияет?

    • @June_sun_day
      @June_sun_day 4 роки тому

      @@selfedu_rus у меня сейчас pygame 2.0.1, Python 3.8.7

    • @khadzhik-_-8737
      @khadzhik-_-8737 4 роки тому

      при втором способе такая же ситуация, а в первом все ок

    • @June_sun_day
      @June_sun_day 4 роки тому

      @@khadzhik-_-8737 блин, а у меня и в первом способе не работало 🤷

    • @iwanzhrabny6010
      @iwanzhrabny6010 4 роки тому +4

      @@selfedu_rus такая же ситуация, но если задать толщину прямоугольника, то всё ок

  • @Andrei-de6mf
    @Andrei-de6mf 4 роки тому +10

    четкие ролики, и почему так мало просмотров?

  • @letsplaytv5298
    @letsplaytv5298 4 роки тому +4

    ЭТО ТО, ЧТО МНЕ НУНЖО БЫЛО!!!

  • @DearHRS
    @DearHRS 3 роки тому +6

    моя программа работает, но она не рисует, когда ep находится в отрицательном состоянии, pygame 2.0.1 (SDL 2.0.14, Python 3.7.8)
    спасибо за лекцию

    • @viktorial.7545
      @viktorial.7545 3 роки тому +1

      +++

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

      та же проблема, когда rect принимает отрицательные значения ширины и высоты ничего не рисуется, pygame 2.0.1 (SDL 2.0.14, Python 3.8.0)

    • @ИгорьДавыдовский-ф9ь
      @ИгорьДавыдовский-ф9ь 3 роки тому

      И у меня то же самое. Слева направо - сверху вниз рисует, а наоборот нет.

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

    Спасибо за уроки!
    Только как и у предыдущих у меня не может поворачиваться прямоугольник при отрицательных ширине и высоте. Pygame = 2.0.2
    документацию читал. там написано, что
    " The size values can be programmed to have negative values, but these are considered illegal Rects for most operations."
    "Значения размеров можно запрограммировать на отрицательные значения,но для большинства операций они считаются недопустимыми Rects."

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

    Я вот не понимаю что делает и как работает строка: width = pos[0] - sp[0]
    И такая же с height

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

      pos - это переменная, при ее первичном определении - начальные координаты курсора мыши. Когда мы начинаем им двигать, координаты меняются, но начальные уже записаны в переменную sp. После мы определяем две переменные: ширину и высоту, и из конечных координат (pos) вычитаем начальные(sp). Таким образом, получаем величины, сначала ширину - по икс, а потом по высоте - игрек. То есть, если бы у нас начальные координаты были 150 и 150, а конечные, к примеру, 250 и 250, то высота и ширина составили бы по 100 и получился бы квадрат.

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

      @@lingvitos стало понятнее спасибо!

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

    Как будто версии пайгейма имеют значение. У некоторых людей прямоугольник не рисуется при отрицательных значениях положения мышки (у меня тоже), но у меня ещё одна проблема: нет реакции на отпускание кнопки мыши и треульник продолжает рисоваться, стоит мне только один раз нажать кнпоку мыши и отпустить её.
    При этом события MOUSEBUTTONUP обрабатываются. Проверяил, принтуя каждый раз текст при событиях MOUSEBUTTONDOWN и MOUSEBUTTONUP .

  • @МаксимМячин-н6р
    @МаксимМячин-н6р 3 роки тому

    Круто! Все работает. Но вот как добавить свой курсор в виде картинки, которую я хочу использовать как картинку?... Точнее, как картинку в виде курсора использовать так, чтобы задний фон оставался тем самым фоном, что я задал изначально, к примеру, какой-то пейзаж за городом игрового мира?
    Я добавил картинку, установил ее курсором, но эта картинка либо рендерится настолько в огромном кол-ве, что можно рисовать всякие фигуры, либо можно добавить заливку экрана, что оставит только курсор без отрисовки его на всем экране в огромном кол-ве. Только вот мне надо оставить то меню, к примеру, где у меня фон в виде картинки, а не заливать сплошным цветом.
    Код ниже:
    import pygame as pg
    pg.init()
    W = 600
    H = 400
    sc = pg.display.set_mode((W, H))
    cursor = pg.image.load('assets/Pictures/png/cursor/Cursor1.bmp').convert() # Тут загружаем сам курсор
    cursor.set_colorkey((255, 255, 255)) # Тут для прозрачности, если он не прозрачный, убираем цвет фона
    cursor = pg.transform.scale(cursor, (30, 42)) # А тут задаем высоту и ширину в пикселях
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    RED = (255, 50, 50)
    GREEN = (30, 255, 30)
    BLUE = (10, 10, 250)
    FPS = 120
    clock = pg.time.Clock()
    pg.mouse.set_visible(False)
    while 1:
    for e in pg.event.get():
    if e.type == pg.QUIT:
    exit()
    pos = pg.mouse.get_pos()
    if pg.mouse.get_focused():
    sc.fill((BLACK)) # Сам экран заливки. Если его не добавить, то их будет очень много
    sc.blit(cursor, pos) # А это, собственно, отрисовка самого курсора
    else:
    sc.fill((BLACK)) # Ну и эта заливка, чтобы курсор пропал, когда выходит за пределы окна
    pg.display.update()
    clock.tick(FPS)
    Ну вот так как-то у меня.

    • @МаксимМячин-н6р
      @МаксимМячин-н6р 3 роки тому

      Хотя, может мне другое использовать вместо строки "sc.blit(cursor, pos)" ?
      Подскажите, пожалуйста, новичку!

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

    как можно сделать так ? 1) При нажатии ЛКМ рисуем синий круг в радиусом R;
    2) При нажатии ПКМ рисуем красный квадрат со стороной R * 2.

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

      Лучше поздно, чем никогда
      import pygame
      pygame.init()
      R = int(input("Укажите R: "))
      screen = pygame.display.set_mode((400, 400))
      screen.fill("#ffffff")
      pygame.display.set_caption("Программа")
      pygame.display.update()
      run = True
      while run:

      for event in pygame.event.get():
      if event.type == pygame.QUIT:
      pygame.quit()
      run = False

      elif event.type == pygame.MOUSEBUTTONDOWN:
      if event.button == 1:
      #screen.fill("#ffffff")
      pygame.draw.circle(screen, "blue", (event.pos[0], event.pos[1]), R)
      pygame.display.update()

      elif event.button == 3:
      #screen.fill("#ffffff")
      pygame.draw.rect(screen, "red", (event.pos[0], event.pos[1], R*2, R*2))
      pygame.display.update()

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

    А кто знает как вместо прямоугольника отрисовать эллипс?

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

    у меня проблема: координаты х и у могут ити только в минус, тоесть прямоугольник рисуеться только когда мишь движеться вниз направо, хотя в коде я не могу найти отличия от вашего , в чём может быть проблема? версия PYthon 3.7.9

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

      а, уже в коментах помогли, спасибо за ролик!

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

    а если мы возьмём у нас будет игра и в ней мы будим выбирать варианты ну дапустим ответы

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

    Я не могу понять что такое флаг

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

      Это просто булевая переменная

  • @highgujj
    @highgujj 6 місяців тому +1

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