Привет! Меня зовут Александра, и сегодня я расскажу вам простыми словами, как работают классы в Python, используя живой пример — создание трёхмерной игры. Мы пройдём весь путь вместе, начиная с чистого листа и заканчивая созданием собственных объектов и взаимодействий в виртуальном пространстве.

Часть 1. Начинаем с пустого мира

Допустим, у вас уже установлены PyCharm или любая другая среда разработки, а также библиотека Ursina (если она не установлена, ознакомьтесь с инструкцией по установке, читайте статью). Сегодня мы поговорим о классах, поэтому желательно заранее понимать, что такое функции в Python.

Создадим небольшой сценарий, в котором у нас есть открытый мир с главным героем, землёй и небом. Мы сможем перемещаться по карте и исследовать пространство:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
player = FirstPersonController()

# Земля
ground = Entity(   
model='plane',    
scale=(100, 1, 100),   
texture='grass',   
collider='box')

Sky()
app.run()

Часть 2. Добавляем сферу

Мы создали простенькую сцену, но пока там нечего рассматривать. Давайте сделаем что-нибудь заметное, например, сферу:

sphere = Entity(model="sphere")

Часть 3. Классы в Python

Сначала информация о классе из официальной документации: «Классы предоставляют средство для объединения данных и функциональности. Создание нового класса создаёт новый тип объекта, позволяющий создавать новые экземпляры этого типа. Каждый экземпляр класса может иметь атрибуты для поддержания своего состояния. Экземпляры классов также могут иметь методы (определённые самим классом) для изменения своего состояния».

Итак, зачем нам классы? Представьте ситуацию: у вас есть сотни или тысячи сфер разного цвета, размера и поведения. Можно было бы прописывать каждую вручную, но это утомительно и неэффективно. В этом случае нам пригодятся классы.

В Python класс позволяет объединить данные и функциональность в единый контейнер. Из документации мы знаем, что класс позволяет определить новые типы объектов и создавать экземпляры этих типов.

Из документации:

Простейшая форма определения класса выглядит следующим образом:

class ClassName:     <statement-1>     <statement-N>

В моём случае я напишу:

class MySphere:
    sphere = Entity(model="sphere")

Теперь добавлю init() — это позволит инициализировать мою сферу, то есть я создам сферу с определёнными начальными настройками, например, пусть будет красной. Вот правильный код:

class MySphere:
    def __init__(self):
        sphere = Entity(model="sphere")
        sphere.color = color.red

Обратите внимание на использование self. Это ключевое слово в Python, которое обозначает конкретный экземпляр класса. Оно помогает различать отдельные объекты. Через self я ссылаюсь непосредственно на сферу, которую создал.

После запуска я ожидаю увидеть красную сферу, однако её не видно, поскольку я не создала экземпляр класса. Исправляю это:

Из официальной документации:

Для создания экземпляра класса используется функциональная нотация. Просто представьте, что объект класса — это функция без параметров, которая возвращает новый экземпляр класса. Например (при условии наличия указанного выше класса):

x = MyClass()

Таким образом, экземпляр класса — это и есть создание самой сферы и сохранение её в переменную sphere_1.

sphere_1 = MySphere()

И если я захочу создать пять разных сфер, мне нужно создать пять экземпляров класса, при этом я хочу, чтобы у сфер были случайным образом сгенерированные координаты по оси X:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
from random import  randint

app = Ursina()
player = FirstPersonController()
ground = Entity(
    model='plane',
    scale=(100, 1, 100),
    texture='grass',
    collider='box'

)
Sky()

class MySphere:
    def __init__(self):
        sphere = Entity(model="sphere")
        sphere.color = color.red
        sphere.position = (randint(1,20),5,4)

sphere_1 = MySphere()
sphere_2 = MySphere()
sphere_3 = MySphere()
sphere_4 = MySphere()
sphere_5 = MySphere()

app.run()

Здесь мы определяем класс MySphere, а метод init описывает, как создать новую сферу красного цвета и расположить её случайно по горизонтали.

Часть 4. Что такое self?

Self — это особое слово в Python, которое обозначает конкретный экземпляр класса. Оно помогает отслеживать различия между объектами. Используя self, мы говорим программе, какой именно объект мы имеем в виду, и работаем именно с ним.

Поэтому перепишу код правильно:

class MySphere:
    def __init__(self):
        self.sphere = Entity(model="sphere")
        self.sphere.color = color.red
        self.sphere.position = (randint(1,20),5,4)

После запуска программы я визуально не вижу никаких изменений, их не будет сейчас. Но если без self написать весь последующий код, то будет либо неправильно работать, либо возникнет ошибка. Ведь через self я обращаюсь конкретно к каждой отдельной сфере.

Часть 5. Добавление входных значений в класс

Теперь я хочу, чтобы при создании каждой сферы я могла указывать, какого цвета будет эта сфера. Вот правильный код:

class MySphere:
    def __init__(self, my_color):
        self.sphere = Entity(model="sphere")
        self.sphere.color = my_color
        self.sphere.position = (randint(10,20),5,4)

sphere_1 = MySphere(color.red)
sphere_2 = MySphere(color.blue)
sphere_3 = MySphere(color.green)
sphere_4 = MySphere(color.red)
sphere_5 = MySphere(color.red)

Так мы можем динамически передавать нужные параметры при создании новых сфер.


Надеюсь, это разъясняет принцип работы классов в Python и даёт представление о том, как эффективно организовывать игровой процесс в 3D среде. Если хотите продолжить чтение или задать вопросы, оставляйте комментарии!


Ссылка на мой Телеграм-канал: Нажмите сюда

Давайте создадим сообщество школьников-программистов и будем создавать интересные проекты и игры на Python.