Космические приключения с Python и Pygame. Обработка столкновений
Мы продолжаем создание игры про «Космические приключения» с Python и Pygame. Очень важной частью этой игры является возможность уничтожения вашего космического корабля в результате столкновения с астероидом. И в сегодняшней статье мы рассмотрим как реализовать данную возможность Вы можете проверить столкновения, используя GameObject.collides_with(), представленную в одной статей. Все, что вам нужно сделать, это вызвать этот метод для каждого астероида.
Отредактируйте метод _process_game_logic() в классе SpaceRocks из файла game.py следующим образом:
def _process_game_logic(self):
for game_object in self._get_game_objects():
game_object.move(self.screen)
if self.spaceship:
for asteroid in self.asteroids:
if asteroid.collides_with(self.spaceship):
self.spaceship = None
break
Если какой-либо из астероидов сталкивается с космическим кораблем, то космический корабль уничтожается. В этой игре вы представите это, установив для self.spaceship значение None.
Обратите внимание, что в начале цикла также есть проверка для self.spaceship. Это потому, что когда космический корабль уничтожен, нет причин проверять какие-либо столкновения с ним. Кроме того, обнаружение столкновения с объектом None приведет к ошибке.
Теперь, когда космический корабль может иметь значение None, важно обновить _get_game_objects() в классе SpaceRocks, чтобы избежать попыток отрисовать или переместить разрушенный космический корабль:
def _get_game_objects(self):
game_objects = [*self.asteroids]
if self.spaceship:
game_objects.append(self.spaceship)
return game_objects
То же самое касается обработки ввода:
def _handle_input(self):
for event in pygame.event.get():
if event.type == pygame.QUIT or (
event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
):
quit()
is_key_pressed = pygame.key.get_pressed()
if self.spaceship:
if is_key_pressed[pygame.K_RIGHT]:
self.spaceship.rotate(clockwise=True)
elif is_key_pressed[pygame.K_LEFT]:
self.spaceship.rotate(clockwise=False)
if is_key_pressed[pygame.K_UP]:
self.spaceship.accelerate()
Теперь вы можете запустить свою игру и увидеть, что космический корабль исчезает после столкновения с астероидом:
Теперь ваш космический корабль может летать и уничтожаться при столкновении с астероидами.