Оконный
и полноэкранный режимы работы имеются во всех современных играх написанных
и в OpenGL и в DirectX.
Полное
быстродействие достигается в полноэкранном режиме, хотя на современных
машинах работа не слишком требовательных к быстродействию игр даже в оконном
режиме не приводит к ощутимым задержкам в работе.
Оконный
режим подходит для небольших, казуальных игр, использующих немного ресурсов
и не требующих максимального быстродействия. Однако имейте в виду, что
оконный режим - это режим главным образом предназначенный для отладочных
целей. Максимально достижимое быстродействие достигается ТОЛЬКО в полноэкранном
режиме. Но этот режим не подходит для отладочных целей, т.к. в нём невозможно
поймать и отследить все ошибки, кроме того, при некоторых особо фатальных
ошибках возврат из этого режима вообще может оказаться невозможным без
перезагрузки компьютера.
Именно
поэтому, пока Вы еще чувствуете, что Ваша игра "сыровата", тестируйте
и отлаживайте ее в оконном режиме. Он позволит Вам в особо фатальных случаях
просто снимать приложение через диспетчер задач, что в случае полноэкранного
режима не всегда может оказаться возможным.
Если
Вам ясен весь материал, изложенный в 2х предыдущих уроках, то в общих
чертах работа D3D-приложения в оконном режиме Вам тоже должна быть понятна.
Размер
рабочей области окна D3D в оконном режиме определяется размерами того
окна, чей обработчик (Handle) задан при передаче параметров во время создания
объекта IDirect3DDevice8
В
этом легко убедиться заглянув в код методов TD3DGameApp.Create_ и TD3DGameApp.CreateDisplayObjects
Поэтому
далее мы рассмотрим лишь код и особенности, которые необходимо учитывать
при включении полноэкранного режима D3D-приложения и при переключениях между
полноэкранным/оконным режимами.
Если
взять в качестве основы проект, который мы создали в предыдущем уроке, то
вот код, который необходимо добавить в модуль главной формы (MainForm) этого
проекта для переключения приложения в полноэкранный режим.
Прежде
всего нужно предусмотреть пункт меню или клавиши, которые будут использоваться
Вашим D3D-приложением для переключений между оконным/полноэкранными режимами.
В
случае оконного режима это может быть обычный пункт меню TMainMenu. В
полноэкранном режиме ситуация несколько сложнее - в этом режиме главное
меню окна не отображается, именно поэтому для выхода из полноэкранного
режима нужно использовать какую-либо клавишу (комбинацию клавиш), причем
обрабатываемую средствами DirectInput, можно также использовать игровое
меню, реализуемое средствами Direct3D без использования TMainMenu.
Необходимо
кратко познакомиться со средствами управления игрой через интерфейс DirectInput,
т.к. это понадобится Вам в дальнейшем и сейчас - для обработки переключений
между полноэкранным/оконными режимами.
Не
вдаваясь в подробности документации по DirectX, которую Вы, надеюсь, найдете
и изучите самостоятельно по мере необходимости, DirectInput8 - это более
скоростное и эффективное средство опроса устройств ввода - клавиатуры,
мыши и других подключаемых устройств (всемозможных джойстиков, рулей и
прочего).
Использование
DirectInput8 для того, чтобы пользователь мог быстро управлять игрой,
а игра быстро реагировать на команды пользователя сводится к следующему
-
в
пункт uses секции interface нужно подключить модуль DX8_DIUtil8.pas из
библиотеки Delphi DirectX 8.1
в
этой же секции описать константы, которые будут определять наборы клавиш
клавиатуры и мыши задающие те или иные действия игрока в игровом приложении,
например
const
ChangeWindowModeKey
= isButton1; //константа
isButton1 определена в модуле DX8_DIUtil8.pas
в
описании класса D3D-приложения (класс TD3DGameApp в нашем случае) добавить
поле
m_DXInput:
TDXInput; //управление игрой через DirectInput
Также
в описании класса нужно добавить несколько новых методов -
Далее
в секции implementation нужно реализовать код данных методов -
procedure
TD3DGameApp.SetDefaultDefKeys;
begin
FCustomKeyAssign := DefineDefaultKeys; //процедуру
DefineDefaultKeys нужно определить как локальную для модуля //главной
формы Вашего проекта
end;
в
секции интерфейса она записывается как
function
DefineDefaultKeys: TKeyAssignList;
а
в секции реализации как
function
DefineDefaultKeys: TKeyAssignList;
begin
FillChar(Result, SizeOf(Result), 0);
AssignKey(Result, ChangeWindowModeKey, [Ord('W'), VK_F6]); //к
данному действию привязываются клавиши
W и F6
end;
далее
реализуем код оставшихся методов
procedure
TD3DGameApp.CreateInputObjects;
begin
SetDefaultDefKeys;
m_DXInput := TDXInput.Create(Self);
end;
procedure
TD3DGameApp.DestroyInputObjects;
begin
FreeAndNil(m_DXInput);
end;
procedure
TD3DGameApp.UpdateInput;
var
CurrentState: TUserInput;
begin
if not Assigned(m_DXInput) then Exit;
m_DXInput.Update;
if
ChangeWindowModeKey in m_DXInput.States then {выполнить
нужное действие};
end;
вызов
метода CreateInputObjects нужно добавить внутри TD3DGameApp.OneTimeSceneInit
вызов
метода DestroyInputObjects нужно добавить внутри TD3DGameApp.FinalCleanup
или другом методе освобождения ресурсов, который вызывается из FormDestroy
вызов
метода UpdateInput, в котором осуществляется обновление состояния устройств
DirectInput и вызов методов обработки тех или иных действий пользователя
нужно добавить внутри метода TD3DGameApp.FrameMove
Итак,
переключение полноэкранного/оконного режимов D3D-приложения будет происходит
по действию ChangeWindowModeKey. Данное действие будет вызываться клавишами
[W] или [F6]. Можете использовать другие клавиши, если хотите.
Остается
в строке кода
if
ChangeWindowModeKey in m_DXInput.States then {выполнить
нужное действие};
комментарий
{выполнить
нужное действие}
заменить
на вызов метода, который бы вызывал фактическое переключение режима приложения
из оконного в полноэкранный и обратно.
Таким
методом является следующий -
procedure
TOptionsMenu.AcceptOptions;
var
ScreenSizeMetric: TScreenSizeMetric;
begin
if g_d3dApp = nil then Exit;
ScreenSizeMetric := GetScreenSize;
if (not g_d3dApp.m_bFullScreen = Windowed) and
(g_d3dApp.m_dwScreenWidth = ScreenSizeMetric.Width) then Exit;
В
данном случае такой метод реализован как метод объекта меню TOptionsMenu
и вызывается при подтверждении смены заданных настроек приложения. В данном
случае настройки достаточно просты. Проверяется заданное в настройках
разрешение экрана и если произошла смена режима оконный/полноэкранный
или изменилось заданное разрешение будет вызван метод SwitchDisplayModes
объекта g_d3dApp, который является экземпляром класса TD3DGameApp.
В
простейшем случае можно рассмотреть реализацию переключений между оконным
режимом приложения и полноэкранным режимом с разрешением например 800x600
пикселей и максимальной частотой покадровой развертки поддерживаемой монитором
(100 Hz или выше).
Предварительно
добавьте данный метод в описание класса TD3DGameApp
function
SwitchDisplayModes(bFullScreen: Boolean;
dwWidth, dwHeight: Cardinal): HRESULT;
Затем
реализуйте его в коде следующим образом -
function
TD3DGameApp.SwitchDisplayModes(bFullScreen: Boolean;
dwWidth, dwHeight: Cardinal): HRESULT;
var
hr: HResult;
begin
if not m_bIsActive or not m_bDisplayReady then begin
result := S_OK;
Exit;
end;
// Check to see if a change was actually requested
if bFullScreen then
begin
if ((m_dwScreenWidth = dwWidth) and (m_dwScreenHeight = dwHeight)) and
(m_bFullScreen = bFullScreen ) then
begin
result := S_OK;
Exit;
end;
end
else
begin
if not m_bFullScreen then begin
result := S_OK;
Exit;
end;
end;
// Invalidate the old display objects
m_bDisplayReady := FALSE;
InvalidateDisplayObjects;
// Set up the new presentation paramters
if bFullScreen then
begin
m_d3dpp.Windowed := FALSE;
m_d3dpp.hDeviceWindow := m_hWndMain;
m_dwScreenWidth := dwWidth;
m_d3dpp.BackBufferWidth := dwWidth;
m_dwScreenHeight := dwHeight;
m_d3dpp.BackBufferHeight := dwHeight;
m_d3dpp.BackBufferFormat := m_d3dfmtFullscreen;
end
else
begin
m_d3dpp.Windowed := TRUE;
m_d3dpp.hDeviceWindow := 0;
m_d3dpp.BackBufferWidth := 0;
m_d3dpp.BackBufferHeight := 0;
// Reset the device
hr := m_pd3dDevice.Reset( m_d3dpp );
if SUCCEEDED(hr) then
begin
m_bFullScreen := bFullScreen;
hr := RestoreDisplayObjects;
if SUCCEEDED(hr) then
begin
m_bDisplayReady := TRUE;
result := S_OK;
Exit;
end;
end;
// If we get here, a fatal error occurred
PostMessage( m_hWndMain, WM_CLOSE, 0, 0 );
result := E_FAIL;
end;
Все
недостающие поля, описанные в реализации данного метода необходимо добавить
в класс TD3DGameApp и инициализировать их в методе конструктора TD3DGameApp.Create
и других необходимых методах, где это понадобится.
Заметьте,
что внутри данного метода каждый раз при переключении между полноэкранным/оконным
режимами или при смене разрешения полноэкранного режима происходит инвалидация
InvalidateDisplayObjects
всех
зависимых от Direct3DDevice ресурсов, вызывается метод сброса устройства
Direct3DDevice, а затем происходит восстановление ресурсов RestoreDisplayObjects
Этот
момент очень важно учитывать при создании многоуровневых игр, в которых
ресурсы для каждого уровня различны и загружаются при разных состояниях
приложения. Тогда при переключении режимов инвалидация и восстановление
необходимых ресурсов должна происходить в зависимости от заданного состояния
приложения, в противном случае Вы получите логические ошибки, ошибки времени
выполнения и множество других ошибок!!!
В
случае с игрой "Ну, Погоди!" этот момент упущен, т.к. все необходимые
ресурсы загружаются, инвалидируются, восстанавливаются и уничтожаются
централизованно при старте приложения и его закрытии, а переключение в
полноэкранный режим не используется.
В
качестве практики предлагаю Вам внедрить вышеописанные технологии в код
проекта своего D3D-приложения посвященного практической работе над данным
уроком.
Ежемесячный журнал комиксов и инди-игр Мегаинформатик #9 сентябрь 2025+, #1 (25) январь 2026, Img Gen Megainformatic - локальная Нейросеть для генерации изображений, Img Gen Megainformatic Log модуль для Forge версии 2024-Aug-10 - локальной Нейросети для генерации изображений
читать
читать
скачать
скачать
Ежемесячный журнал комиксов и инди-игр Мегаинформатик #12 декабрь 2025, комиксы: Веб-Мастер и Маргарита #14, Кыся #3 - комикс фэнтези, Твое будущее #1 - комикс
смотреть
читать
скачать
октрыть
Ежемесячный журнал комиксов и инди-игр Мегаинформатик #11 ноябрь 2025, комиксы: Сикс Икс Икс - Двойное дно (6xx) #14 - комикс 18+, Несравненная Рокси #1 - комикс 18+, Эмми город надежд #3 - комикс
смотреть
читать
скачать
скачать
комиксы, Ежемесячный журнал комиксов и инди-игр megainformatic.ru #10 октябрь 2025, #6 июнь 2025+ дополнение к основному номеру за июнь, Полное превращение #1 - комикс, #7 июль 2025+ дополнение к основному номеру за июль
смотреть
скачать/читать
читать
интересное
комиксы, Ежемесячный журнал комиксов и инди-игр megainformatic.ru #9 сентябрь 2025
смотреть
читать
смотреть
starcraft комикс
комиксы
смотреть
читать комикс
читать
читать
комиксы
читать
смотреть
читать
читать комикс
игра Fishka. Ежемесячный журнал комиксов и инди-игр megainformatic.ru #8 август 2025, другие комиксы
играть
читать
читать
комикс
ежемесячный журнал комиксов и инди-игр megainformatic.ru #6 июнь 2025 - специальный выпуск Квантум 28 страниц win/linux/android/html5/pdf полная версия скачать или запустить в браузере, игра lollypop 1994 времен ms-dos, ежемесячный журнал комиксов и инди-игр megainformatic.ru #5 май 2025+ 18+ дополнение к основному номеру. Все выпуски за 1 полугодие 2025 года в одном номере - #1 январь - #6 июнь 2025 108 страниц pdf/win/linux/android/html5
скачать
играть
читать
читать
ежемесячный журнал комиксов и инди-игр megainformatic.ru #5 май 2025 - выпуск 5, #6 июнь 2025 - выпуск 6, #4 апрель 2025 спец. выпуск GAME дополнение к апрельскому номеру - все комиксы по играм!, выпуск #7 июль 2025
скачать
читать
открыть
смотреть
журнал комиксов - приложение к журналу комиксов megainformatic.ru #1 январь 2025 - выпуск 1, журнал комиксов #4 апрель 2025, 18+ дополнение #3 к журналу март 2025, 18+ дополнение #2 к журналу февраль 2025
читать
журнал
18+ дополнение #3
18+ дополнение #2
игра, журналы комиксов - номера за 2025 год - январь 2025 - март 2025
играть
смотреть
читать
журнал
игры, сервисы
играть
играть
случайный сайт
играть
видео-рассказ, уроки godot, виртуальный помощник по поиску информации
играть
читать
купить
скачать
игры Многоликий: dress - hordes эпизоды с 1 по 4
играть
скачать
купить
купить
игры, музыкальные клипы
скачать
скачать
смотреть
скачать/играть
музыкальный клип, игры
смотреть
играть
скачать
скачать
разработка игр, анимационный фильм, новогодняя дискотека 2020 - песни на итальянском, игра про лифт
смотреть
смотреть
смотреть
смотреть
игры, инструменты разработки, анимационный фильм, фильм.
купить
смотреть
смотреть
скачать
игры
скачать
скачать
скачать
купить
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере (3), создание музыки в браузере (1)
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
бк 0010.01 - играть!
играть
игры в браузере
играть
играть
играть
играть
игры в браузере (3), скачиваемые (1)
играть
играть
играть
скачать
игры в браузере
играть
играть
играть
играть
игры в браузере, скачиваемые игры
играть
скачать
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
Foxyland 2
quidget 2
играть
играть
полезный софт, игры в браузере
скачать
anova игра
A Knots Story
sabotage
сервисы, игры
24500 руб.
скачать
игра
играть
игры, программы
купить / скачать
купить
5500 руб.
скачать
поздравления, уроки рисования, уроки создания сайтов
читать
читать
читать
150 руб.
комиксы, музыка, рассказы
читать
читать
слушать
читать
игра для разработки, калькулятор услуг, cms, комикс
250 руб.
разработка на заказ
1250 руб.
350 руб.
игры для разработки, комиксы
скачать
читать
читать
скачать
игры шарики и ямки, комиксы про Костю Коробкина, ria xxl игра, fly snow 3d генератор эффектов снега, частиц и др. -
скачать
читать
150 руб.
350 руб.
Создай свою игру на fle game engine -
800 руб.
240 руб./скачать
скачать
скачать
Для создания сайта - модуль отзывов/комментариев для вашего сайта в составе megainformatic cms express files -
700 руб.
1250 руб.
150 руб.
500 руб.
Уроки Flash, бесплатные Flash - игры.
бесплатно
бесплатно
2500 руб.
14000 руб.
Поддержка сайтом нескольких языков (multi lang), создание собственной системы личных кабинетов, соц. сети или фриланс - биржи (megainformatic cms social), создание сервиса коллективных покупок на базе megainformatic cms groupon, онлайн сервис подсчёта статистики ключевых слов в статьях вашего сайта keywords gen + описание кода данного сервиса, с возможностью бесплатно реализовать его аналог на своём собственном сайте.
500 руб.
12000 руб.
14000 руб.
бесплатно
megainformatic.ru/webjob/ - сервис для фриланс проектов
- место встречи заказчиков и исполнителей
megainformatic.ru/webjob/ - сервис для фриланс проектов
- место встречи заказчиков и исполнителей
Системы управления сайтом, уроки
1250 руб.
бесплатно
550 руб.
500 руб.
megainformatic cms admin - простая и компактная система
для работы и управления сайтом
350 руб.
5800 руб.
3000 руб.
500 руб.
megainformatic cms free и серия продуктов - Уроки Photoshop
бесплатно
650 руб.
700 руб.
750 руб.
Данная серия посвящена описанию приемов и методов создания изображений,
с помощью инструментария программы Adobe Photoshop. Кроме того, многие
описанные средства могут вам помочь при освоении и многих других программ
для работы с растровой графикой - GIMP, Corel Photo Paint и других.
бесплатные игры 2d и 3d, а также эмулятор Ну, Погоди!
300 руб.
бесплатно
бесплатно
бесплатно
Это серия распространяемых бесплатно игр. Вы не только можете поиграть,
но и скачать исходники, получив тем самым возможность внести изменения
в игру или создать новую !!! (эмулятор Ну, Погоди! распространяется платно).
серия игр про Веселого Буквоежку, и бесплатно распространяемая игра
Нечто: Необъяснимое - в плену желаний
350 руб.
510 руб.
fle game engine
бесплатно
Здесь представлены новинки жанра - Говорящий Комикс, Настольная игра,
А также продукт, который позволит Вам научиться создавать игры самостоятельно.
Ну и конечно изюминка в своём роде - бесплатная игра - Нечто: Необъяснимое
- в плену желаний
Серия бесплатных онлайн уроков, посвященных 3ds max, photoshop, c++,
directx, delphi и php.
бесплатно
бесплатно
бесплатно
бесплатно
бесплатно
бесплатно
500 руб.
300 руб.
Описаны практические примеры решения различных задач, возникающих при
создании игр и сайтов.
Продукты Набор разработчика и Ваше Визуальное Шоу распространяются платно.
уроки и продукты различной тематики
бесплатно
бесплатно
бесплатно
400 руб.
Бесплатные Уроки Photoshop free, Бесплатные Уроки по программированию
на delphi directx - Как создать игру Ну, Погоди!, Бесплатная Авторская
музыка в формате mp3 - Музыкальные Миры, Платно распространяемый продукт
megainformatic cms express - система для быстрого создания Вашего сайта
на php + my sql.
Проекты игр, уроки
450 руб.
бесплатно
бесплатно
бесплатно
Игра Веселый Буквоежка, уроки delphi directx 8.1 для начинающих (описываются
основы 3d игр), моделируем девушку в 3d studio max, уроки музыки - пишем
музыку в Fruity Loops Studio
megainformatic
cms express files - это простое, быстрое и очень компактное решение
для создания первого вашего сайта. НЕ ИСПОЛЬЗУЕТ базы данных mysql.
Вместо этого используются файловые базы данных. Поэтому Вы
можете использовать систему даже на хостинге с поддержкой php, но
без поддержки баз данных my sql.
Очень
проста в установке - достаточно вам скопировать все файлы на ваш
хостинг и сайт готов к работе !!!
В комплект входят 3 готовых шаблона, модули поиска и карты сайта,
а также статьи по основам создания сайта.
megainformatic.ru ежемесячный журнал комиксов #4 апрель 2025 - иллюстрированное дополнение к журналу #4 - полная версия
24.03.2025
megainformatic.ru ежемесячный журнал комиксов и инди-игр #4 апрель 2025+ - дополнение к основному
выпуску номера
Содержит комиксы и другие материалы не вошедшие в основной номер журнала.