Події в ігровому середовищі

Додамо до проекту фігуру, котра буде рухатись за вказівником миші. 

Всі події (Interrupt Events), котрі відбуваються на ігровому полі, фіксуються (Event Listener) середовищем pygame. Настання події може зумовити виконання певного коду, обробника цієї події Event Handler.


Так, у нашому шаблоні вже використане очікування подій: pygame.event.get(). Якщо отримана подія "закрити вікно", це означає завершення гри.

if event.type == pygame.QUIT


Можна переглянути всі події, які трапляються в грі. Для цього потрібно використати команду друку подій в циклі (для кожної події, яка трапляється в грі - друкуємо цю подію, і перевіряємо, чи це не означає кінець гри).

    for event in pygame.event.get():

        print(event)

        if event.type == pygame.QUIT:

            done = True

Отримаємо приблизно такий результат виведення:

<Event(4-MouseMotion {'buttons': (0, 0, 0), 'pos': (420, 318), 'rel': (-1, -1)})>

<Event(5-MouseButtonDown {'pos': (420, 318), 'button': 3})>

<Event(6-MouseButtonUp {'pos': (420, 318), 'button': 3})>

<Event(2-KeyDown {'unicode': ' ', 'key': 32, 'scancode': 57, 'mod': 0})>

<Event(3-KeyUp {'scancode': 57, 'key': 32, 'mod': 0})>

<Event(2-KeyDown {'unicode': '', 'key': 273, 'scancode': 72, 'mod': 0})>

<Event(3-KeyUp {'scancode': 72, 'key': 273, 'mod': 0})>

<Event(2-KeyDown {'unicode': '', 'key': 274, 'scancode': 80, 'mod': 0})>

<Event(3-KeyUp {'scancode': 80, 'key': 274, 'mod': 0})>

Це події, згенеровані рухом мишки, клацанням кнопок мишки, натисканням клавіш на клавіатурі. Як бачимо, кожна із цих подій має певні параметри, які можна використати для обробки цієї події: координати, яку саме кнопку чи клавішу натиснуто тощо.


Додамо команду виведення координат положення мишки (між командами заповнення вікна білим кольором screen.fill(WHITE) та оновлення вмісту ігрового вікна та pygame.display.flip() ):

    screen.fill(WHITE)

    pos = pygame.mouse.get_pos()

    print(pos)

    pygame.display.flip()


Отримуємо координати вказівника миші у вигляді так званого масиву. До окремих елементів цього масиву (координата X та координата Y) можна отримати доступ за їхнім індексом. Ці координати можна використати для побудови, наприклад, прямокутника:

    pos = pygame.mouse.get_pos()

    x=pos[0]

    y=pos[1]

    pygame.draw.rect(screen,BLACK,[x,y,50,50])


Доповнення 1

Додамо до проекту команди так, щоб прямокутник змінював свій колір, коли перетинається з м'ячем, що рухається по горизонталі. 

До ігрового циклу додаємо налаштування м'ячика:

pos_x=50

krok=5

В ігровому циклі додаємо м'ячик, що рухатиметься по горизонталі:

    pygame.draw.ellipse(screen,BLACK,(pos_x,50,25,25),1)

    pos_x+=krok

    if pos_x>670 or pos_x<0:

        krok=-krok

Обчислимо різницю між координатами прямокутника (рухається за вказівником миші, має координати x та y) та м'ячика (рухається по горизонталі, має координати pos_x та 50). Якщо різниця між координатами прямокутника і м'яча менша за 20 (по модулю) - малюється прямокутник червоного кольору, інакше малюється прямокутник чорного кольору.

    if abs(x-pos_x)<20 and abs(y-50)<20:

        pygame.draw.rect(screen,RED,[x-25,y-25,50,50])

    else:

        pygame.draw.rect(screen,BLACK,[x-25,y-25,50,50])


Доповнення 2

Додамо до проекту команди так, щоб прямокутник змінював свій колір (на червоний), при клацанні мишкою.

    if pygame.mouse.get_pressed()[0]:

        pygame.draw.rect(screen,RED,[x-25,y-25,50,50])


Додамо функцію пострілу: якщо натиснуто кнопку миші, то з прямокутника робиться "постріл" кулькою, що летить вгору.

Якщо натиснуто кнопку миші pygame.mouse.get_pressed()[0], то у змінні a та b записуємо координати положення миші (збігаються з координатами положення прямокутника). Далі малюємо кульку зеленого кольору, і координата y якої буде зменшуватись (рух вгору).

    if pygame.mouse.get_pressed()[0]:

        a=x

        b=y

    pygame.draw.ellipse(screen,GREEN,(a,b,25,25),1)

    b-=5

Для коректної роботи програми задайте початкові значення a та b рівними -100 (початкове положення - за межами екрану).


Доповнення 3

Додайте до проекту перевірку зіткнення двох кульок - тої, що рухається по горизонталі та пострілу з прямокутника. При зіткненні вони повинні зникати.

Остання зміна: середа 31 січня 2018 10:08