Събития с мишка¶
В примера “превключвател” показахме как можем да реагираме в програма, когато потребителят натисне бутон на мишката. Въпреки че за потребителя едно щракване изглежда като еднократно действие, видяхме, че за компютъра това е последователност от събития, която започва със събитие от типа pg.MOUSEBUTTONDOWN.
В следващите примери и задачи ще използваме три типа събития, генерирани от мишката:
Натискане на който и да е бутон на мишката (като в примера с превключвателя), в този случай event.type има стойност pg.MOUSEBUTTONDOWN
Освобождаване на бутон на мишката, в този случай еvent.type има стойност pg.MOUSEBUTTONUP
Преместване на мишката, в този случай event.type има стойност pg.MOUSEMOTION. Всъщност при движение на мишката се генерират множество такива събития (всяко от тях описва малко движение на мишката в много кратък интервал от време, така че всяко събитие от този вид обикновено описва движение само на няколко пиксела).
Обектите на събитието, чийто тип е pg.MOUSEBUTTONDOWN, също съдържат допълнителна информация, като например:
event.pos - положението на мишката по време на регистриране на събитието (вече използвано в примера на превключвателя)
event.button - число от 1 до 5, указващо кой бутон на мишката е натиснат (1 - вляво, 2 - в средата, 3 - вдясно, 4 - превъртете нагоре, 5 - превъртете надолу)
Някои от допълнителните данни за събитията, съдържащи се в pg.MOUSEMOTION обекти са:
event.pos - позицията на мишката след събитието за движение на мишката
event.rel - подредена двойка, която описва колко се е променила позицията на мишката след предишното събитие за движение на мишката
event.buttons - списък с три елемента на логически стойности, които определят за всеки от трите бутона на мишката (0 - вляво, 1 - средна, 2 - дясна) дали е натиснат по време на движение на мишката.
Обработка на щракване - упражнения¶
Може да не сте забелязали, че в програмата “превключване” от предишния урок, светлината може да бъде включена и изключена, като щракнете върху който и да е бутон на мишката. Това е така, защото за всеки бутон на мишката се генерира един и същ тип събитие и не проверихме кой бутон е натиснат, когато събитието се е случило.
Задача - ляв бутон като превключвател:
Копирайте програмата “превключвател” тук, след което я променете, така че светлината да може да се включва и изключва само с левия бутон на мишката.
Съвет: Използвайте данните event.button.
Задача - три превключвателя:
Използвайте части от програмата “превключвател” и създайте програма, която симулира работата на три превключвателя, както е показано в примера.






Други събития с мишка¶
Както бе споменато в началото на този урок, една програма може също така да реагира на събития за освобождаване на бутона на мишката и движение на мишката. За целта е необходимо да се сравни стойността на event.type с константите pg.MOUSEBUTTONUP и pg.MOUSEMOTION. Следват задачи, в които можете да изпробвате това.
Задача - рисуване на линии:
Попълнете програмата, така че да може да очертава прави линии, както в примера.
Задача - рисуване на линии с изтриване:
Копирайте програмата за рисуване на линии по-долу, след което добавете възможност за изтриване на всички линии с десен бутон.
Съвет: За да разграничите левия и десния бутон на мишката в програмата, данните event.button трябва да се използват отново. Кодът във функцията handle_event сега трябва да изглежда така:
Задача - влачене:
Следващата програма показва как да се позволи на потребителя на програмата да влачи обекти.
Изпробвайте програмата (плъзнете ябълките в кошницата) и се опитайте да я разберете, след което отговорете на въпросите по-долу.



- индексът на ябълката, която рисуваме
- Опитай пак
- индексът на ябълката, която влачим
- Вярно
- общ брой ябълки
- Опитай пак
- броя на ябълките, останали на дървото
- Опитай пак
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
- четем, че бутонът на мишката е надолу по време на движение
- Това не е удобен начин, тъй като бутонът може да бъде натиснат на празно място (потребителят не е "взел" обекта, който трябва да се влачи)
- влаченето е отделен тип събитие
- Не, няма такъв тип събития
- когато обикновеното движение на мишката индексът на "ябълката, която влачим" е -1
- Вярно
Q-80: Как различаваме между влаченето от обикновено движение на мишката в дадена програма?