Книга «Изучаем Python»



Pdf көрінісі
бет149/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   145   146   147   148   149   150   151   152   ...   238
Байланысты:
2 5343781172763690906

Рис. 14.1. Кнопка Play выводится тогда, когда игра неактивна

Запуск игры

Чтобы при нажатии кнопки 

Play


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

game_


functions .py

 следующий код для отслеживания событий мыши над кнопкой:



game_functions.py

def check_events(ai_settings, screen, stats, play_button, ship, bullets):

"""Обрабатывает нажатия клавиш и события мыши."""



Добавление кнопки Play    285

for event in pygame.event.get():

if event.type == pygame.QUIT:

...


        elif event.type == pygame.MOUSEBUTTONDOWN:

            mouse_x, mouse_y = pygame.mouse.get_pos()



            check_play_button(stats, play_button, mouse_x, mouse_y)

def check_play_button(stats, play_button, mouse_x, mouse_y):

    """Запускает новую игру при нажатии кнопки Play."""

    if play_button.rect.collidepoint(mouse_x, mouse_y):



        stats.game_active = True

Обновленное определение 

check_events()

 получает параметры 

stats

 и 


play_button

Параметр 



stats

 будет использоваться для обращения к флагу 

game_active

, а 


play_

button


 — для проверки того, была ли нажата кнопка 

Play


.

Pygame обнаруживает событие 

MOUSEBUTTONDOWN

, когда игрок щелкает в любой точке 

экрана , но мы хотим ограничить игру, чтобы она реагировала только на щелчки 

на кнопке 

Play

. Для этого будет использоваться метод 



pygame.mouse.get_pos()

возвращающий кортеж с координатами 



x

 и 


y

 точки щелчка . Эти значения пере-

даются функции 

check_play_button()

 , которая использует метод 

collidepoint()

 

для проверки того, находится ли точка щелчка в пределах области, определяемой 



прямоугольником кнопки 

Play


 . Если точка находится в пределах кнопки, флаг 

game_active

 переводится в состояние 

True


, и игра начинается!

При вызове 

check_events()

 в 


alien_invasion .py

 должны передаваться два дополни-

тельных аргумента, 

stats


 и 

play_button

:

alien_invasion.py

# Запуск основного цикла игры.

while True:

   gf.check_events(ai_settings, screen, stats, play_button, ship,

       bullets)

...


К этому моменту вы сможете запустить и сыграть полноценную игру. После за-

вершения игры значение 

game_active

 становится равным 

False

, а кнопка 



Play

 снова 


появится на экране.

Сброс игры

Только что написанный нами код работает при первом нажатии кнопки 

Play


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

к окончанию игры, еще не были сброшены.

Чтобы игра сбрасывалась при каждом нажатии кнопки 

Play

, необходимо сбросить 



игровую статистику, стереть старых пришельцев и пули, построить новый флот 

и вернуть корабль в центр нижней стороны:



game_functions.py

def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,

        bullets, mouse_x, mouse_y):



286    Глава 14  •  Ведение счета

"""Запускает новую игру при нажатии кнопки Play."""

if play_button.rect.collidepoint(mouse_x, mouse_y):

        # Сброс игровой статистики.

        stats.reset_stats()



stats.game_active = True

        


        # Очистка списков пришельцев и пуль.

        aliens.empty()



        bullets.empty()

        


        # Создание нового флота и размещение корабля в центре.

        create_fleet(ai_settings, screen, ship, aliens)



        ship.center_ship()

Мы обновляем определение 

check_play_button()

, чтобы в нем были доступны 

объекты 

ai_settings

stats


ship


aliens


 и 

bullets


. Эти объекты необходимы для 

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

ментов игры.

В точке  обновляется игровая статистика, вследствие чего игрок получает 

три новых корабля. После этого флаг 

game_active

 переводится в состояние 

True


 (чтобы игра началась сразу же после выполнения кода функции), группы 

aliens


 и 

bullets


 очищаются , создается новый флот, а корабль выравнивается 

по  центру .

Для этого необходимо изменить определение 

check_events()

, как и вызов 

check_


play_button()

:



Достарыңызбен бөлісу:
1   ...   145   146   147   148   149   150   151   152   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет