Создание космической аркады с Python и Pygame. Добавляем класс астероида
В предыдущей статье по Python и Pygame мы завершили создание логики для космического корабля. Но корабль все еще один в пустом пространстве. Пора добавить несколько астероидов. И в сегодняшней статье мы создадим данный игровой объект.
Астероиды
На данный момент у наc один космический корабль, способный перемещяться по экрану. В конце этой статьи на экране должны появиться несколько астероидов. Более того, мы собираетесь реализовать столкновения между космическим кораблем и астероидами.
Создание класса
Подобно космическому кораблю, мы начнем с создания класса под названием Asteroid, который наследуется от GameObject. Для чего отредактируем файл space_rocks/models.py так:
class Asteroid(GameObject):
def __init__(self, position):
super().__init__(position, load_sprite("asteroid"), (0, 0))
# Как и раньше, вы начинаете с вызова конструктора GameObject с определенным изображением. Вы добавили изображение на одном из предыдущих шагов.
# Затем импортируйте новый класс в space_rocks/game.py:
import pygame
from models import Asteroid, Spaceship
from utils import load_sprite
# В заключение, отредактриуем конструктор класса SpaceRocks так, чтобы создать шесть астероидов:
def __init__(self):
self._init_pygame()
self.screen = pygame.display.set_mode((800, 600))
self.background = load_sprite("space", False)
self.clock = pygame.time.Clock()
self.asteroids = [Asteroid(0, 0) for _ in range(6)]
self.spaceship = Spaceship((400, 300))
Теперь, когда в игре стало больше игровых объектов, было бы неплохо создать вспомогательный метод в классе SpaceRocks, который будет возвращать их все. Затем этот метод будет использоваться логикой рисования и перемещения. Таким образом, мы сможем позже ввести новые типы игровых объектов и изменить только этот единственный метод, или мы сможем исключить некоторые объекты из этой группы, если это необходимо.
Реализуем метод _get_game_objects():
# game.py
def _get_game_objects(self):
return [*self.asteroids, self.spaceship]
Теперь используем его для перемещения всех игровых объектов в одном цикле, отредактировав _process_game_logic():
def _process_game_logic(self):
for game_object in self._get_game_objects():
game_object.move(self.screen)
# То же самое касается _draw():
def _draw(self):
self.screen.blit(self.background, (0, 0))
for game_object in self._get_game_objects():
game_object.draw(self.screen)
pygame.display.flip()
self.clock.tick(60)
Запустим игру:
>>>python __main__.py
К сожалению, все астероиды скопились в одном углу.
Ну, это было отчасти ожидаемо, так как все астероиды создаются с положением (0, 0), которое представляет собой верхний левый угол. Вы можете изменить это, установив произвольную позицию на экране.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.