Събития с мишка

В примера “превключвател” показахме как можем да реагираме в програма, когато потребителят натисне бутон на мишката. Въпреки че за потребителя едно щракване изглежда като еднократно действие, видяхме, че за компютъра това е последователност от събития, която започва със събитие от типа pg.MOUSEBUTTONDOWN.

В следващите примери и задачи ще използваме три типа събития, генерирани от мишката:

Обектите на събитието, чийто тип е pg.MOUSEBUTTONDOWN, също съдържат допълнителна информация, като например:

Някои от допълнителните данни за събитията, съдържащи се в pg.MOUSEMOTION обекти са:

Обработка на щракване - упражнения

Може да не сте забелязали, че в програмата “превключване” от предишния урок, светлината може да бъде включена и изключена, като щракнете върху който и да е бутон на мишката. Това е така, защото за всеки бутон на мишката се генерира един и същ тип събитие и не проверихме кой бутон е натиснат, когато събитието се е случило.

Задача - ляв бутон като превключвател:

Копирайте програмата “превключвател” тук, след което я променете, така че светлината да може да се включва и изключва само с левия бутон на мишката.

Съвет: Използвайте данните event.button.

Задача - три превключвателя:

Използвайте части от програмата “превключвател” и създайте програма, която симулира работата на три превключвателя, както е показано в примера.

../_images/Shema3_Off.png ../_images/Shema3_On.png ../_images/SwitchOff.png ../_images/SwitchOn.png ../_images/BulbOff.png ../_images/BulbOn.png

Други събития с мишка

Както бе споменато в началото на този урок, една програма може също така да реагира на събития за освобождаване на бутона на мишката и движение на мишката. За целта е необходимо да се сравни стойността на event.type с константите pg.MOUSEBUTTONUP и pg.MOUSEMOTION. Следват задачи, в които можете да изпробвате това.

Задача - рисуване на линии:

Попълнете програмата, така че да може да очертава прави линии, както в примера.

Задача - рисуване на линии с изтриване:

Копирайте програмата за рисуване на линии по-долу, след което добавете възможност за изтриване на всички линии с десен бутон.

Съвет: За да разграничите левия и десния бутон на мишката в програмата, данните event.button трябва да се използват отново. Кодът във функцията handle_event сега трябва да изглежда така:

Задача - влачене:

Следващата програма показва как да се позволи на потребителя на програмата да влачи обекти.

Изпробвайте програмата (плъзнете ябълките в кошницата) и се опитайте да я разберете, след което отговорете на въпросите по-долу.

../_images/apple.png ../_images/basket.png ../_images/drag_scene.png

    Q-78: Каква е променливата i_apple в програмата?

  • индексът на ябълката, която рисуваме
  • Опитай пак
  • индексът на ябълката, която влачим
  • Вярно
  • общ брой ябълки
  • Опитай пак
  • броя на ябълките, останали на дървото
  • Опитай пак
    Q-79: Съберете проверките на програмата с техните значения. Опитай пак!
  • if mouse_is_on_image(event.pos, basket_pos, basket_image):
  • whether the apple should be deleted
  • if mouse_is_on_image(event.pos, apple_positions[i]
  • whether the user "took" the apple
  • if len(apple_positions) == 0:
  • whether the game is over
  • if i_apple >= 0:
  • whether a drag is ongoing

    Q-80: Как различаваме между влаченето от обикновено движение на мишката в дадена програма?

  • четем, че бутонът на мишката е надолу по време на движение
  • Това не е удобен начин, тъй като бутонът може да бъде натиснат на празно място (потребителят не е "взел" обекта, който трябва да се влачи)
  • влаченето е отделен тип събитие
  • Не, няма такъв тип събития
  • когато обикновеното движение на мишката индексът на "ябълката, която влачим" е -1
  • Вярно