Пошаговое создание игры «Same Game». Урок №3

  Дмитрий Бушуев  | 

    | 

  Обновл. 19 Авг 2019  | 

 294

В предыдущем уроке мы занимались частью Document архитектуры «Document/View», в этом же уроке мы займёмся частью View, а именно: начнём отрисовку нашей игры.

The View: Отрисовка игры SameGame

Теперь, когда документ содержит инициализированный объект игрового поля, нам нужно отобразить эту информацию пользователю. Именно здесь уже можно заметить, что наша игра начинает «оживать».

Первым шагом является добавление кода для изменения параметров окна до нужного размера. Сейчас окно имеет размер, заданный по умолчанию, что не является тем, что нам нужно. Мы исправим это в переопределяемом методе OnInitialUpdate(). Класс View наследует базовый метод OnInitialUpdate(), который задаёт представление нашего документа, и мы должны переопределить этот метод, чтобы получить возможность изменять размеры окна. Для того чтобы это реализовать, нам нужно открыть окно свойств заголовочного файла CSameGameView (который фактически будет называться SameGameView.h): для этого нажмите Alt+Enter или в меню Вид > Окно свойств (в других версиях Visual Studio может быть следующее: Вид > Другие окна > Окно свойств). Найдите опцию OnInitialUpdate и выберите <Add> OnInitialUpdate как показано на скриншоте ниже:

Тем самым мы добавим переопределённый метод OnInitialUpdate() к нашему View с небольшим содержанием по умолчанию для вызова функции ResizeWindow(). Таким образом, заголовочный файл SameGameView.h будет иметь следующий вид:

Помимо этого, нам также нужно будет добавить код отрисовки в класс CSameGameView. Заголовочные и исходные файлы для View уже содержат переопределение функции OnDraw(). Здесь мы и поместим наш код. Ниже приведен полный исходный код для SameGameView.cpp:

Нарисовать игровую доску очень просто, мы будем перебирать каждую строку, столбец за столбцом и рисовать цветной прямоугольник. У функции OnDraw() есть один аргумент — указатель на CDC. Класс CDC является базовым классом для всех контекстов устройства. Контекст устройства — это обобщённый интерфейс устройства вывода, такого как экран или принтер.

Вначале мы инициализируем указатель на Document, чтобы иметь возможность получить данные игрового поля. Далее мы вызываем функцию SaveDC() из контекста устройства. Эта функция сохраняет состояние контекста устройства, чтобы мы могли восстановить его после того, как закончим.

Затем нам нужно покрасить фон клиентской области в чёрный цвет. Для этого нам нужно получить размеры клиентской области — вызываем GetClientRect(). Вызов GetBoardSpace(-1,-1) в Document возвратит цвет фона, а FillSolidRect() заполнит клиентскую область фоновым цветом.

Теперь пришло время нарисовать отдельные прямоугольники. Для этого нам нужно сначала нарисовать цветной прямоугольник, а затем обвести его чёрным контуром. Нам нужно создать объект кисти, чтобы сделать контур. Кисть HOLLOW_BRUSH, которую мы создаём, называется hollow (в переводе «пустой»), потому что, когда мы рисуем прямоугольник, MFC захочет заполнить его внутренность каким-нибудь цветом. Мы не хотим этого, поэтому будем использовать HOLLOW_BRUSH. Создание кисти приводит к выделению GDI памяти, которую позднее нам нужно будет очистить.

Вложенные циклы for очень просты, они перебирают строку за строкой, столбец за столбцом, получая цвет соответствующего пространства доски из Document с помощью функции GetBoardSpace(), вычисляя размер прямоугольника, который нужно закрасить и затем выполняется сам процесс закрашивания блока. При отрисовке используются два метода:

   FillSolidRect() — для заполнения цветной части блока;

   Rectangle() — для рисования контура блока.

Последняя функция, которую мы вставили в View, изменяет размер окна в зависимости от размера игрового поля. В последующих уроках мы добавим дополнительный функционал, чтобы пользователь мог изменять количество и размер блоков, так что эта функция нам ещё пригодится. Как и в прошлый раз, мы начинаем с получения указателя на Document, а затем получаем размер текущей клиентской области и текущего окна.

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

Наконец, функция GetParentFrame() возвращает указатель на класс CMainFrame, который является фактическим окном нашей игры, и мы изменяем размер окна, вызывая MoveWindow().

Сейчас ваше приложение должно выглядеть примерно следующим образом:

Заключение


В этой статье мы рассмотрели некоторые основы MFC и архитектуру «Document/View», которую обеспечивает данная технология. Мы собрали объект игрового поля, который содержит наши данные, и создали представление, которое отображает эти данные пользователю. В следующих уроках мы рассмотрим обработку событий.

Урок №3. Исходный код игры «SameGame» на С++

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (2 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *