Добавить в корзинуПозвонить
Найти в Дзене
ZDG

Пишем Питона на Питоне #5: View

Предыдущие части: Визуализация поля, Загрузка уровня, INI-файл, Пишем Питона на Питоне! В предыдущей части мы ознакомились с кодом для вывода игрового уровня на экран. Но оставить его просто болтаться в main.py нельзя. Давайте повторим, в каких режимах может находиться игра: Мы написали код для отображения режима "Игра", но остались другие режимы. В каждом из них нужно отображать что-то своё, и также действует своя логика событий. В главном меню нужно отобразить заставку и кнопки меню; в настройках – названия настроек и управляющие элементы (вкл/выкл), в таблице рекордов – список с именами и очками. Куда девать весь этот код? В кучу мы его сваливать не будем. Поэтому для каждого режима игры мы сделаем свой класс отображения. Весь код, необходимый для отображения данных в конкретном режиме, будет находиться внутри конкретного класса. У нас будет несколько классов отображения, но очевидно, что все они могут наследоваться от одного общего класса, который мы назовём View. Давайте сделаем

Предыдущие части: Визуализация поля, Загрузка уровня, INI-файл, Пишем Питона на Питоне!

В предыдущей части мы ознакомились с кодом для вывода игрового уровня на экран. Но оставить его просто болтаться в main.py нельзя.

Давайте повторим, в каких режимах может находиться игра:

  1. Главное меню
  2. Настройки
  3. Таблица рекордов
  4. Игра

Мы написали код для отображения режима "Игра", но остались другие режимы. В каждом из них нужно отображать что-то своё, и также действует своя логика событий. В главном меню нужно отобразить заставку и кнопки меню; в настройках – названия настроек и управляющие элементы (вкл/выкл), в таблице рекордов – список с именами и очками.

Куда девать весь этот код? В кучу мы его сваливать не будем. Поэтому для каждого режима игры мы сделаем свой класс отображения. Весь код, необходимый для отображения данных в конкретном режиме, будет находиться внутри конкретного класса.

У нас будет несколько классов отображения, но очевидно, что все они могут наследоваться от одного общего класса, который мы назовём View. Давайте сделаем в проекте папку app/views и создадим в ней файл view.py (ссылка):

Это базовый класс View (представление), который содержит общие свойства и методы. Каждому представлению для работы нужно два параметра: во-первых, графический контекст, в котором нужно рисовать, во-вторых, данные, которые нужно отобразить.

Именно эти параметры мы передаём в конструктор класса. Кроме того, мы создаём свойства x, y, width, height, которые управляют тем, в каком месте экрана будет отображаться представление и какие у него будут размеры.

Метод set_pos() предназначен для установки позиции и размеров представления. По умолчанию в конструкторе позиция задаётся как (0,0), а размеры соответствуют размерам графического окна.

Методы render() и update() предназначены для отображения и обновления представления соответственно. В базовом классе они не реализованы. Это должны сделать классы-наследники.

Теперь напишем представление для режима игры. Оно будет отрисовывать уровень. Код отрисовки уже готов, нужно только обернуть его в класс GameView, который будет отнаследован от класса View (ссылка):

Теперь в main.py мы можем написать:

from app.views.view import GameView
view = GameView(graphics, level)
view.render()
graphics.update()

Создаём объект класса GameView, передав ему графический контекст (graphics) и данные уровня (level). И затем просто вызываем метод view.render(). Всё, представление нарисовало само себя.

То, что мы сделали, является реализацией шаблона проектирования MVC: контроллер это наш главный файл main.py, модель – класс Level, а представление – класс GameView.

Таким же образом нам нужно сделать представления для главного меню и других экранов, но это всё будет впереди. А мы в следующей части займёмся обработкой ввода и движением питона по уровню, чтобы побыстрее получить рабочий прототип.

Текущий архив проекта выложен на Яндекс-диск.

pypy05.zip

Следующая часть:

картинка для заставки
картинка для заставки