В проекте реализованы три класса:
Player
- Игрок
Enemy
- Враг
Wall
- Стена
Игрок отличается от других объектов тем, что у него есть метод для управления. Враг перемещается автоматически, а Стена - это статичный объект. Но при этом у каждого объекта есть набор одинаковых свойств. Один и тот же код присутствует во всех трёх классах.
Одна из важнейших концепций ООП - это наследование. Наследование - это возможность вынести в отдельный класс часть кода, которая одинакова для разных классов.
Это пример создания общего класса, где указаны общие свойства и методы для каждого объекта:
class MySprite:
def __init__(self, x, y, width, height, color):
self.x = x
self.y = y
self.width = width
self.height = height
self.color = color
self.player_surface = pygame.Surface((self.width, self.height))
self.player_surface.fill(self.color)
def update(self):
screen.blit(self.player_surface, (self.x, self.y))
Класс, который наследует все свойства и методы суперкласса, называется наследником:
class Player(MySprite):
def control(self, speed):
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
self.x += speed
if keys[pygame.K_LEFT]:
self.x -= speed
if keys[pygame.K_UP]:
self.y -= speed
if keys[pygame.K_DOWN]:
self.y += speed
class Enemy(MySprite):
direction = "вниз"
def move(self, speed):
if self.y <= 50:
Enemy.direction = "вниз"
elif self.y >= 500:
Enemy.direction = "вверх"
if Enemy.direction == "вниз":
self.y += speed
elif Enemy.direction == "вверх":
self.y -= speed
У Игрока и Врага теперь отсутствует свойство speed
, но значение скорости можно передавать методам в качестве аргумента.
В классе Wall
пока нет дополнительных методов, класс полностью наследуется от класса MySprite
:
class Wall(MySprite):
pass
Класс-наследник может изменять методы, полученные по наследству от суперкласса. Изменения будут работать в наследнике, но не затронут суперкласс.