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



Pdf көрінісі
бет125/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   121   122   123   124   125   126   127   128   ...   238
Байланысты:
2 5343781172763690906

УПРАЖНЕНИЯ

12-1 . Синее небо: создайте окно Pygame с синим фоном .

12-2 . Игровой персонаж: найдите изображение игрового персонажа, который вам нравится, 

в формате  .bmp (или преобразуйте существующее изображение) . Создайте класс, который 

рисует персонажа в центре экрана, и приведите цвет фона изображения в соответствие 

с цветом фона экрана (или наоборот) .

Управление кораблем

Реализуем возможность перемещения корабля по горизонтали. Для этого мы на-

пишем код, реагирующий на нажатие клавиш 

 или . Начнем с движения впра-

во, а потом применим те же принципы к движению влево. Заодно вы научитесь 

управлять перемещением изображений на экране.

Обработка нажатия клавиши

Каждый раз, когда пользователь нажимает клавишу, это нажатие регистрируется 

в Pygame как событие. Каждое событие идентифицируется методом 

pygame.event.

get()


, поэтому в функции 

check_events()

 необходимо указать, какие события 

должны отслеживаться. Каждое нажатие клавиши регистрируется как событие 

KEYDOWN

.

При обнаружении события 



KEYDOWN

 необходимо проверить, была ли нажата кла-

виша, инициирующая некоторое игровое событие. Например, при нажатии кла-

виши 


 значение 

rect.centerx

 корабля увеличивается для перемещения корабля 

вправо:


game_functions.py

def check_events(ship):

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



Управление кораблем    241

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

        elif event.type == pygame.KEYDOWN:



            if event.key == pygame.K_RIGHT:

                # Переместить корабль вправо.

                ship.rect.centerx += 1



Функции 

check_events()

 передается параметр 

ship


, потому что корабль должен 

двигаться вправо при нажатии клавиши 



. Внутри 

check_events()

 в цикл событий 

добавляется блок 

elif

 для выполнения кода при обнаружении события 



KEYDOWN

 . 


Чтобы проверить, является ли нажатая клавиша клавишей 

 (

pygame.K_RIGHT

), 

мы читаем атрибут 



event.key

 . Если нажата клавиша 



, корабль перемещается 

вправо, для чего значение 

ship.rect.centerx

 увеличивается на 1 .

Вызов 

check_events()



 в 

alien_invasion .py

 необходимо изменить, чтобы в аргументе 

передавался объект 

ship

:

alien_invasion.py



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

while True:

        gf.check_events(ship)

gf.update_screen(ai_settings, screen, ship)

Если запустить программу 

alien_invasion .py

 сейчас, вы увидите, что корабль переме-

щается вправо на 1 пиксел при каждом нажатии клавиши 



. Неплохо для начала, 

но это не лучший способ управления кораблем. Чтобы управление было более 

удобным, следует реализовать возможность непрерывного перемещения.

Непрерывное перемещение

Если игрок удерживает клавишу 

, корабль должен двигаться вправо до тех пор, 

пока клавиша не будет отпущена. Чтобы узнать, когда клавиша 



 будет отпущена, 

наша игра отслеживает событие 

pygame.KEYUP

; таким образом, реализация непре-

рывного движения будет основана на отслеживании событий 

KEYDOWN


 и 

KEYUP


 в со-

четании с флагом 

moving_right

.

В неподвижном состоянии корабля флаг 



moving_right

 равен 


False

. При нажатии 

клавиши 

 флагу присваивается значение 

True


, а когда клавиша будет отпущена, 

флаг возвращается в состояние 

False

.

Класс 



Ship

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

с именем 

moving_right

 и метод 

update()


 для проверки состояния флага 

moving_


right

. Метод 


update()

 изменяет позицию корабля, если флаг содержит значение 

True

. Этот метод будет вызываться каждый раз, когда вы хотите обновить позицию 



корабля.

Ниже приведены изменения в классе 

Ship

:

ship.py



class Ship():


242    Глава 12  •  Стреляющий корабль

def __init__(self, screen):

...

# Каждый новый корабль появляется у нижнего края экрана.



self.rect.centerx = self.screen_rect.centerx

self.rect.bottom = self.screen_rect.bottom

        # Флаг перемещения

        self.moving_right = False



    def update(self):

        """Обновляет позицию корабля с учетом флага."""

        if self.moving_right:

            self.rect.centerx += 1

    def blitme(self):

        ...

Мы добавляем атрибут 

self.moving_right

 в методе 

__init__()

 и инициализируем 

его значением 

False


 . Затем вызывается метод 

update()


, который перемещает 

корабль вправо, если флаг равен 

True

 .


Теперь внесем изменения в 

check_events()

, чтобы при нажатии клавиши 

 

moving_


right

 присваивалось значение 

True

, а при ее отпускании — 



False

:



Достарыңызбен бөлісу:
1   ...   121   122   123   124   125   126   127   128   ...   238




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

    Басты бет