Статья Автор: Омарбек Нұр-Мұхаммед

Работа над проектом 4

В проекте реализованы три класса:

  • Player - Игрок
  • Enemy - Враг
  • Wall - Стена

Игрок отличается от других объектов тем, что у него есть метод для управления. Враг перемещается автоматически, а Стена - это статичный объект. Но при этом у каждого объекта есть набор одинаковых свойств. Один и тот же код присутствует во всех трёх классах.

Одна из важнейших концепций ООП - это наследование. Наследование - это возможность вынести в отдельный класс часть кода, которая одинакова для разных классов.

 

Это пример создания общего класса, где указаны общие свойства и методы для каждого объекта:

class MySprite:  # суперкласс
    def __init__(self, x, y, width, height, color):
        self.x = x            # координата по оси X
        self.y = 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

 

 

Класс-наследник может изменять методы, полученные по наследству от суперкласса. Изменения будут работать в наследнике, но не затронут суперкласс.


Наследование - очень полезный инструмент, который значительно упрощает написание кода и добавляет новые возможности. В модуле PyGame уже есть класс Sprite, который можно использовать в качестве суперкласса.

 

Задание: нужно реализовать следующее наследование -

  • Класс MySprite должен наследоваться от класса Sprite
  • Все остальные классы наследуются от класса MySprite

 

Требования:

  • В классе наследнике класса Sprite нужно реализовать два свойства:
    • image - изображение (можно подобрать изображения для игрока, врага и стены, или оставить поверхность)
    • rect - прямоугольник (положение спрайта)
  • В классе наследнике класса Sprite должен быть вызван конструктор класса Sprite
    • pygame.sprite.Sprite.__init__(self)
  • В классе наследнике класса Sprite нужно переименовать метод .update(), например назвать его reset
  • Методы .control() и .move() нужно переименовать и назвать их update (метод для реализации изменения объекта)
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать