Программирование стратегических игр с DirectX 9.0


Программирование стратегических игр с DirectX 9 0


Геометрия используемая для двухмерной визуализации в трехмерном пространстве
На Рисунок 6.19 представлены четыре пронумерованных вершины. Первой вершине присвоен номер 0, а последней — номер 3. Номера на Рисунок 6.19 соответствуют позициям в массиве вершин из приведенного...
Загрузка текстур
Буфер вершин полностью наряжен, но пока нет места куда он мог бы пойти. Как насчет нескольких текстур? Оставшаяся часть кода инициализации осуществляет загрузку текстур, необходимых программе Titl...
Функция vRender()
Вы готовы к визуализации? Думаю, да. Следуйте за мной к функции vRender(). Вот как выглядит ее код:void vRender(void) { // Очистка вторичного буфера g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET...
Функция vDrawInterfaceObject()
Функция vDrawInterfaceObject() не является частью DirectX. Я создал ее специально для этой программы чтобы упростить трехмерную визуализацию двухмерных объектов. Функция выполняет ту же работу, чт...
Отображение текстуры в трехмерном пространстве на экране
На Рисунок 6.20, точка с координатами (0,0) соответствует центру экрана. Это коренным образом отличается от традиционной двухмерной визуализации. В традиционной двухмерной среде изображенной на р...
Расположение текстур на титульном экране
На Рисунок 6.21 изображен экран обрамленный тонкой линией. Кроме того там изображены шесть текстур, расположенных в виде сетки. Эти шесть текстур полностью заполняют экран. Поскольку ширина и выс...
Горячие точки или как я научился любить щелчки мыши
Теперь у вас есть чудесно выглядящий титульный экран, но идти дальше никуда нельзя. Лучшим выбором будет добавить несколько функциональных возможностей для работы с мышью и двигаться дальше! Преды...
Обнаружение активных зон
Если вы забыли, что такое активная зона, пожалуйста вернитесь к началу этой главы и еще раз прочитайте раздел «Активные зоны и графика». Первая из программ, которые мы сейчас рассмотрим, называетс...
Окно программы D3D_MouseZones
На Рисунок 6.22 показан экран с главным окном программы. В данном примере работают не все кнопки меню, а только Options и Exit. Программа устанавливает активные зоны и реагирует на щелчки пользов...
Архитектура проекта D3D_MouseZones
Проект содержит четыре уникальных файла: main.cpp, main.h, MouseZoneClass.cpp и MouseZoneClass.h. Файлы с кодом класса для реализации активных зон являются основным отличием этого проекта от преды...
Заголовочный файл Main h
Главный заголовочный файл проекта называется main.h. В нем я выполняю следующие действия: Устанавливаю глобальные переменные Direct3D. Устанавливаю структуру настраиваемого формата вершин. Устанав...
Глобальные данные активных зон
Большая часть кода в файле main.h аналогична содержимому одноименного файла из предыдущего примера. Главные отличия заключаются в добавлении глобальных переменных и прототипов функций для работы с...
Файл программы Main cpp
Следующий уникальный файл проекта называется main.cpp. Он содержит обычный код Windows и некоторый объем нового кода для обработки ввода от мыши и обнаружения активных зон....
Функция WinMain()
Функция WinMain() в рассматриваемой программе изменилась весьма незначительно. Взгляните на приведенный ниже фрагмент кода, в котором выделены главные отличия:// Инициализация Direct3D if(SUCCEEDE...
Первый экран программы D3D_MouseZones
Сейчас изображенный на Рисунок 6.23 экран должен выглядеть для вас очень знакомо. Это титульный экран игры Battle Armor. Поскольку делать на титульном экране почти нечего, я устанавливаю лишь пар...
Функция vSetupMouseZones()
Функция vSetupMouseZones() содержит следующий код:void vSetupMouseZones(int iMenu) { // Титульный экран if(iMenu == 0) { MZones.vFreeZones(); MZones.vInitialize(2); MZones.iAddZone("TITLE_SCR...
Функция MouseZoneClass vFreeZones()
Как видите, функция проверяет переданный ей номер меню и действует соответствующим образом. WinMain() при вызове функции передает ей номер меню 0. В коде, относящемся к меню с номером 0, первым ра...
Функция MouseZoneClass vInitialize()
Затем вызывается функция MouseZoneClass::vInitialize(). Она выделяет память для активных зон, количество которых передано ей в параметре. Вы можете указать число, превышающее максимальное количест...
Функция MouseZoneClass iAddZone()
Прототип добавляющей активную зону функции выглядит следующим образом:int MouseZoneClass::iAddZone( char *szZoneName, short shX, short shY, short shWidth, short shHeight, short shClickType) Первый...
Функция vCheckInput()
Мы покинули функцию WinMain() и перешли к функции vSetupMouseZones(), а затем к членам класса активных зон. Настало время вернуться обратно к функции WinMain() и посмотреть где обрабатываются собы...
Управление щелчками мыши
Внутри этого небольшого фрагмента кода находится вызов функции vCheckInput(). Возможно, вы недоумеваете для чего здесь нужен вызов функции timeGetTime(). Дело в том, что современные компьютеры нас...
Вычисление смещения клиентской области окна на рабочем столе
Поскольку окна в операционной системе могут перемещаться, программа сначала должна проверить где именно расположено окно в данный момент. Эту задачу выполняет вызов функции GetWindowRect(). Вооруж...
Различия между клиентской областью и пространством рабочего стола
На Рисунок 6.24 показано окно игры на рабочем столе системы. Ширина клиентской области окна равна 640 точкам, а высота — 480 точкам. Ширина рабочего стола сотавляет 1024 точки, а его высота — 768...
Перемещение окна на рабочем столе
На Рисунок 6.25 окно было перемещено. Поэтому его клиентская область сместилась на 10 точек вправо и на 10 точек вниз. Щелчки мышью по активной зоне теперь регистрируются со смещением на 10 точек...
Вычисление местоположения указателя мыши
Следующим этапом работы кода является вычисление текущего местоположения указателя мыши. Это делается с помощью вызова предоставляемой Windows функции GetCursorPos(). Эта функция проверяет текущее...
Функция MouseZoneClass bCheckZones()
В следующей части кода выполняется вызов функции bCheckZones(). Эта функция получает текущее состояние мыши и сравнивает его с хранящимися в памяти данными активной зоны. Если кнопки мыши находятс...
Обнаружение сообщений кнопок мыши
Работа функции vCheckInput() зависит от состояния кнопок мыши. К счастью, определение состояния кнопок мыши — очень простой процесс. Взгляните на функцию fnMessageProcessor() из программы. Вот как...
Выход из программы
Давайте на минуту сосредоточим наше внимание на функции WinMain(). Я знаю, что заставляю вас прыгать с места на место, но пожалуйста потерпите. Вернемся к функции WinMain() в которой содержится сл...
Динамическое отображение меню
Мы почти закончили исследование кода программы. К данному моменту вы уже знаете как установить активные зоны, определить местоположение указателя мыши, обрабатывать сообщения кнопок мыши и заверши...
Заголовочный файл MouseZoneClass h
Итак, вы увидели класс активных зон в действии, и теперь настало время разобраться как он работает. Класс активных зон состоит из двух файлов: MouseZoneClass.h и MouseZoneClass.cpp. Откройте загол...
Структура данных stHotSpot
Первый заслуживающий внимания элемент заголовочного файла класса — структура данных stHotSpot. Вот как выглядит ее код:struct stHotSpot { short m_shZoneXPos; short m_shZoneYPos; short m_shZoneWidt...
Взаимосвязь между структурой данных и активной зоной
Из Рисунок 6.27 видно, что переменные m_shZoneXPos и m_shZoneYPos задают координаты верхнего левого угла зоны. Член данных m_shZoneWidth определяет ширину зоны, а m_shZoneHeight — ее высоту. Член...
Закрытые члены данных класса MouseZoneClass
Далее в заголовочном файле расположено объявление класса MouseZoneClass. Ниже приведен его код:class MouseZoneClass { private: int m_iMaxZones; stHotSpot *m_HotSpots; public: MouseZoneClass(void);...
Функции класса MouseZoneClass
Первые две объявленные функции — это конструктор и деструктор класса. В их прототипах нет ничего необычного; это просто обычная рутина программирования. Следом за ними идет функция vInitialize()....
Файл MouseZoneClass cpp
Файл MouseZoneClass.cpp содержит код функций, объявленных в заголовочном файле. Откройте файл MouseZoneClass.cpp и пойдемте дальше....
Функция MouseZoneClass MouseZoneClass()
Первой из функций является конструктор класса. Его код выглядит следующим образом:MouseZoneClass::MouseZoneClass(void) { // Количество зон равно нулю m_iMaxZones = 0; } Эта функция исключительно п...
Функция MouseZoneClass ~MouseZoneClass()
Следом идет деструктор класса, код которого выглядит так:MouseZoneClass::~MouseZoneClass(void) { // Очистка выделенных зон vFreeZones(); } Единственное действие деструктора — вызов функции vFreeZo...
Функция MouseZoneClass vInitialize()
Ах, наконец-то мы добрались до функции чей код занимает больше двух строк. Она получает максимальное количество активных зон, которые вы намереваетесь использовать, выделяет память для хранения их...
Функция MouseZoneClass vFreeZones()
Данная функция освобождает всю выделенную для активных зон память и сбрасывает значения внутненних переменных. Вот как выглядит ее код:void MouseZoneClass::vFreeZones(void) { int i; if(m_iMaxZones...
Функция MouseZoneClass iAddZone()
Эта функция активирует зону и записывает ее данные в доступный элемент массива структур данных горячих точек. Перед вызовом этой функции необходимо вызвать функцию vInitialize(). Если свободных эл...
Функция MouseZoneClass iRemoveZone()
Данная функция отключает активную зону. Вот ее код:int MouseZoneClass::iRemoveZone(char *szZoneName) { int i; for(i = 0; i < m_iMaxZones; i++) { // Проверим, активна ли зона if(m_HotSpots[i].m_...
Функция MouseZoneClass bCheckZones()
Это наиболее сложная функция в классе активных зон, поскольку она обрабатывает различные типы щелчков мышью. Вот как выглядит ее код:bool MouseZoneClass::bCheckZones(short shX, short shY, char *sz...
Подсветка пунктов меню
Предыдущий пример программы достаточно интересен, но ему не хватает визуальных эффектов. Часть кнопок меню работает, но они выглядят не слишком живыми. Что может помочь? Я знаю — как насчет подсве...
Архитектура проекта D3D_MouseZoneHighlights
Проект содержит четыре уникальных файла: main.cpp, main.h, MouseZoneClass.cpp и MouseZoneClass.h. Данный пример программы является усовершенствованной версией проекта D3D_MouseZones в которой сдел...
Заголовочный файл Main h
Главный заголовочный файл содержит несколько новых строк кода, необходимых для реализации подсветки пунктов меню. Перед тем, как перейти к коду, взгляните на Рисунок 6.28, чтобы увидеть подсветку...
Главное меню с подсветкой кнопки Options
На Рисунок 6.28 показано главное меню. Главное отличие между этим рисунком и предыдущим примером программы заключается в том, что кнопка Options выделена с помощью подсветки. Кнопки меню изменяют...
Файл программы Main cpp
Я не хочу утомлять вас, описывая код с которым вы уже знакомы, так почему бы сразу не перейти к сделанным изменениям? Итак, отправимся к функции vCheckInput(), чтобы увидеть первый набор изменений...
Как определить подсвечиваемую активную зону
Вот как выглядит код функции vCheckInput():void vCheckInput(void) { bool bRet; char szZoneHit[64]; POINT Point; RECT rcWindowRect; int iMouseX; int iMouseY; // Проверка смещения окна GetWindowRect...
Как создать подсвечиваемую активную зону
В функции vCheckInput() вы проверяете активацию подсвечиваемых зон, но как они перед этим были созданы? Очень просто. Вы создаете их в функции vSetupMouseZones(). Данная функция также слегка отлич...
Как отобразить подсветку активной зоны
Итак, вы создали переменные состояния подсвечиваемых активных зон и сами зоны. Теперь пришло время отобразить эти зоны в функции vRender(). К счастью для вашей психики и рассудка по сравнению с пр...
Изображения меню для реализации подсветки
На Рисунок 6.29 представлены пять изображений меню. На первом представлено меню в котором не подсвечен ни один пункт. Следующие четыре изображения представляют меню с различными состояниями подсв...
Итоги
Можете представить себе это? Глава действительно закончилась! Краткий обзор поможет вспомнить вам некоторые вещи, относящиеся к разработке и программированию интерфейса. Определите требования к ин...
Звуковые API
Существует несколько способов воспроизведения звука в компьютерной игре, включая использование различных свободно распространяемых API, таких как OpenAL и DirectX. Кроме того, доступны различные к...
Архитектура DirectMusic
DirectX содержит два интерфейса, которые можно применять для воспроизведения звуковых файлов: DirectSound и DirectMusic. Главное различие между ними заключается в том, что DirectSound предоставляе...
Загрузчик DirectMusic
Загрузчик в DirectMusic одвечает за загрузку аудио-содержимого. С его помощью вы можете загрузить файлы MIDI, файлы WAV, коллекции DLS и файлы сегментов DirectMusic. Как только вы сообщите, какой...
Исполнитель DirectMusic
Подобно тому, как музыкант исполняет произведение, интерфейс исполнителя в DirectMusic отвечает за исполнение музыки. Он управляет воспроизведением, работой с сообщениями, назначением каналов и ко...
Сегменты DirectMusic
Сегменты в DirectMusic представляют собой реально воспроизводимые звуковые данные. Любой файл WAV или последовательность MIDI, которые вы воспроизводите должны быть сперва загружены в сегмент. В D...
Как воспроизвести файл WAV
Я не идиот — по крайней мере, моя жена не называет так меня в открытую, — так что держу пари, что вы главным образом хотите узнать о том, как воспроизводить файлы WAV. Я не могу придумать лучшего...
Проект DMusic_PlaySound
Программа содержит несколько исходных файлов: main.cpp, main.h и DXUtil.cpp. Все они являются уникальными для данного проекта, за исключением файла DXUtil.cpp, который является частью набора вспом...
Поток выполнения программы DMusic_PlaySound
На Рисунок 7.1 видно, что WinMain() вызывает функцию bInitializeSoundSystem(). Эта функция инициализации выполняет несколько вызовов функций DirectX для инициализации звуковой системы. Затем прог...
Заголовочный файл Main h
Откройте заголовочный файл main.h и следуйте за мной. Заголовочный файл в этом примере очень простой и короткий. Вот он целиком:#ifndef MAIN_H #define MAIN_H #define STRICT #include <windows.h&...
Файл программы Main cpp
Главная часть кода расположена в файле программы main.cpp. Пришло время открыть его. Как обычно, нашего внимания требует функция WinMain(). Она содержит стандартный код инициализации приложения Wi...
Функция bInitializeSoundSystem()
Ох парни, сейчас начнется настоящее веселье. Данная функция содержит весь код, необходимый для инициализации DirectMusic. Кроме того, она выполняет загрузку звукового файла, воспроизводимого прогр...
Как инициализировать COM
Первая вещь, которую должен сделать код, — инициализация COM. DirectX использует COM-интерфейсы, так что это неизбежное зло (или добро). Если вы не знакомы с COM, я рекомендую вам пойти в любимый...
Создание интерфейса загрузчика
Следующий фрагмент кода создает интерфейс загрузчика. Как вы, возможно, помните, интерфейс загрузчика отвечает за загрузку звуковых данных, таких как файлы WAV и файлы MIDI. Вот как выглядит соотв...
Создание интерфейса исполнителя
Интерфейс загрузчика занял предназначенное ему место, а следующим этапом будет создание интерфейса исполнителя. Интерфейс исполнителя отвечает за воспроизведение аудиоданных и жизненно важен для D...
Инициализация аудиосистемы
В отличие от загрузчика, исполнитель требует, чтобы после успешного создания интерфейса была выполнена его инициализация. Эта задача осуществляется функцией IDirectMusicPerformance8::InitAudio(),...
Как регулировать громкость
Как я намекал раньше, интерфейс IDirectMusicAudioPath8 позволяет вам регулировать уровень громкости. Для этого предназначена функция SetVolume(), прототип которой выглядит следующим образом:HRESUL...
Загрузка звукового файла
Вы помните интерфейс загрузчика, который создали минуту назад? Пора снова воспользоваться им для загрузки тестового файла WAV, включенного в сопроводительные файлы. Чтобы сделать это, обратимся к...
Как загрузить сегмент
Теперь вы должны загрузить сегмент в объект исполнителя. Эту задачу выполняет функция IDirectMusicSegment8::Download(), прототип которой выглядит так:HRESULT Download( IUnknown* pAudioPath ); Как...
Этапы инициализации DirectMusic
На Рисунок 7.2 видно, как вы инициализировали COM, создали загрузчик, создали исполнителя, инициализировали аудиосистему, получили аудио-путь по умолчанию, установили уровень громкости, загрузили...
Функция vPlaySound()
Пример программы обрабатывает события левой кнопки мыши и вызывает при каждом событии функцию vPlaySound(). Обработкой событий занимается функция fnMessageProcessor(), но представляющий интерес ко...
Воспроизведение звука
Функция PlaySegmentEx() начинает воспроизведение загруженного сегмента. У нее есть несколько параметров, но как видите, в коде моего примера значения многих из них равны NULL. Вот как выглядит про...
Как воспроизвести файл MIDI
Вы когда-нибудь хотели воспроизводить в вашей игре MIDI-файлы? Если да, то вы попали по правильному адресу. К счастью, воспроизводить MIDI-файлы очень просто. Фактически, если вы читали предыдущий...
Окно программы DMusic_PlayMIDI
Спорим, что программа выглядит знакомо? Я сделал лишь несколько косметических изменений в программе воспроизведения WAV-файлов. Например, я изменил имя воспроизводимого файла на c:\dxsdk\samples\...
Как воспроизвести файл MP3
Хотите ли вы, чтобы в вашей игре было реализовано воспроизведение файлов MP3? Если да, этот раздел для вас. К сожалению, воспроизведение файлов MP3 требует полностью нового набора интерфейсов и фу...
Окно программы DShow_PlayMP3
Согласен, в изображенном на Рисунок 7.4 окне нет ничего особенного. Но для этого есть причина: программа создана для воспроизведения файлов MP3, а не для показа вращающихся трехмерных кубов! Тепе...
DirectShow
Первая вещь на которой следует остановиться — имя проекта. В отличие от первых двух проектов из этой главы, имя данного проекта начинается с префикса DShow. Я сделал это потому, что данная програм...
Проект DShow_PlayMP3
Программа содержит несколько файлов с исходным кодом: main.cpp, main.h и DXUtil.cpp. Все исходные файлы, за исключением DXUtil.cpp, являются уникальными для данного проекта. Кроме того, в проекте...
Заголовочный файл Main h
Заголовочный файл main.h содержит обычный набор объявлений глобальных переменных и директив включения файлов, необходимых для примера. Вот как выглядит код секции с директивами включения файлов:#i...
Граф фильтров
DirectShow построен на базе программных фильтров. Фильтры в DirectShow выполняют операции над потоками данных. Фильтры выполняют множество функций, и в число основных входят: Чтение данных из файл...
Граф фильтров MP3
Как видно на Рисунок 7.5, граф фильтров читает данные из файла MP3, декодирует их, а затем отправляет аудиоаппаратуре для воспроизведения. Рабочей лошадкой индустрии фильтров в DirectShow являетс...
Управление аудиовизуальным потоком
В следующей строке кода заголовочного файла я создаю указатель на интерфейс IMediaControl с именем g_pMediaControl. Интерфейс управления аудиовизуальным потоком предназначен для контроля проходящи...
События аудиовизуального потока
Следующим в заголовочном файле расположен указатель на интерфейс IMediaEvent. Этот тип интерфейса используется для коммуникации с графом фильтров. Он будет информировать вас о текущем состоянии во...
Позиционирование аудиовизуального потока
Следующий интерфейс называется IMediaSeeking. Как следует из его названия, он предназначен для установки позиции в аудиовизуальном потоке. Кроме того, он позволяет задать темп воспроизведения ауди...
Файл программы Main cpp
Основной код программы располагается в файле main.cpp. Загрузите его сейчас и следуйте дальше. Найдите в коде функцию WinMain() и обратите внимание на следующий фрагмент:// Воспроизведение музыки...
Функция bPlayTitleMusic()
Эта функция в рассматриваемой программе выполняет большую часть работы. Она инициализирует COM, создает интерфейсы, загружает музыку, устанавливает темп воспроизведения и начинает проигрывание муз...
Инициализация DirectShow
Первая вещь, которую делает функция, — инициализация COM. Это необходимый этап, поскольку DirectShow использует COM-интерфейсы. Следующий шаг к небесам DirectShow — создание объекта графа. Я выпол...
Этапы инициализации DirectShow
На Рисунок 7.6 показана взаимосвязь между интерфейсом управления аудиовизуальным потоком, интерфейсом событий аудиовизуального потока, интерфейсом позиционирования аудиовизуального потока и интер...
Загрузка музыкального файла
Функция IGraphBuilder::RenderFile() выполняет всю работу, необходимую для загрузки файла. Она получает два параметра: первый содержит строку с именем файла, а второй не используется. Как видно из...
Установка темпа воспроизведения
Давайте двигаться дальше. Следующий фрагмент кода задает темп песни. Темп музыки определяет насколько быстро (или медленно) она воспроизводится. Данный параметр может использоваться для того, чтоб...
Воспроизведение музыки
После всей выполненной работы воспроизведение MP3 осуществляется исключительно просто. Достаточно лишь вызвать функцию IMediaControl::Run(). Если функция возвращает S_OK, вы знаете, что воспроизве...
Перехват фоновых событий
Теперь, когда все необходимые части проинициализированы и запущены, код присваивает флагу g_bBackgroundMusicActive значение 1. Благодаря этому цикл сообщений функции WinMain() узнает, что надо про...
Функция vCheckMusicStatus()
Функция vCheckMusicStatus() проверяет завершено ли фоновое воспроизведение музыки. Если да, музыка перематывается к началу и воспроизведение запускается по новой. Вот как выглядит код функции:void...
Проверка кода события
Пришло время использовать старый верный интерфейс IMediaEvent. Этот интерфейс позволяет увидеть состояние музыки. Я вызываю функцию IMediaEvent::WaitForCompletion() чтобы получить самый верхний ко...
Остановка музыки
Следующий фрагмент кода подразумевая, что песня подошла к концу, останавливает музыку, перематывает ее к началу и заново начинает воспроизведение. Остановка музыки осуществляется вызовом функции I...
Перемотка музыки
Теперь, когда музыка остановлена, вам необходимо перемотать ее к началу. Конечно же никакой реальной перемотки не выполняется; вы просто снова устанавливаете указатель позиции на начало песни. Это...
Запуск музыки
Теперь, после того, как песня остановлена и перемотана к началу, я снова запускаю ее воспроизведение с помощью испытанной функции запуска, которой я уже пользовался ранее при инициализации. Взглян...
Поток исполнения программы воспроизведения MP3
На рисунке видно как система инициализирует DirectShow, загружает песню и начинает ее воспроизведение, проверяет не закончилась ли песня, перематывает ее и запускает воспроизведение снова. На это...
Реализация классов звуковой системы
Теперь в вашем распоряжении достаточно знаний, чтобы вы смогли добавить звук в свои игры. Но в своем нынешнем состоянии код недостаточно гибок и его сложно интегрировать в проекты. Для того, чтобы...
Класс звуковой системы
Сперва я опишу структуру класса звуковой системы, которая показана на Рисунок 7.8....
Структура класса звуковой системы
Обратите внимание, что на рисунку показаны три главных метода класса и два главных члена данных. В классе также есть обычные конструктор и деструктор, но на рисунке они не показаны, поскольку при...
Определение класса звуковой системы
Итак, вы познакомились со структурой класса; теперь пришло время посмотреть на реальный код. А вот и он во всей славе:class SoundSystem { private: public: HWND m_hWnd; // Звуковая система IDirectM...
Определение класса звукового фрагмента
Я создал класс GameSound потому, что вам требуется только один объект исполнителя и один объект загрузчика, но несколько сегментов. Данный класс содержит реальные данные звукового сегмента для отд...
Взаимодействие класса звуковой системы и класса звукового фрагмента
Обратите внимание, что интерфейс загрузчика в классе звуковой системы используется для загрузки данных в интерфейс сегмента в классе звукового фрагмента. Кроме того, вы можете заметить, что интер...
Реализация класса звуковой системы
Обзор закончен, так как насчет нескольких фрагментов кода реализации класса, чтобы поддержать разговор? Ниже представлен код конструктора класса:SoundSystem::SoundSystem() { m_pLoader = NULL; m_pP...
Деструктор SoundSystem ~SoundSystem()
В следующем блоке кода представлен деструктор класса:SoundSystem::~SoundSystem() { SAFE_RELEASE(m_pLoader); SAFE_RELEASE(m_pPerformance); } Деструктор освобождает объекты загрузчика и исполнителя....
Функция SoundSystem hrInitSoundSystem()
Первая действительно важная функция — это функция инициализации. Вот ее код:HRESULT SoundSystem::hrInitSoundSystem(void) { HRESULT hResult; IDirectMusicAudioPath8 *path; // Инициализация COM CoIni...
Функция SoundSystem hrLoadSound()
Следующая функция в списке загружает звуковые данные. Вот как выглядит ее код:HRESULT SoundSystem::hrLoadSound(char *szname,GameSound *gs) { WCHAR szWideFileName[512]; // Проверяем инициализирован...
Функция SoundSystem hrPlaySound()
Раз уж мы заговорили о воспроизведении, пришла пора показать вам код функции воспроизведения звука.HRESULT SoundSystem::hrPlaySound(GameSound *gs) { // Проверяем наличие объекта исполнителя if(!m_...
Реализация класса звукового фрагмента
Класс звукового фрагмента является очень простым и содержит только конструктор и деструктор. Вот как выглядит реализация данного класса:// Конструктор GameSound::GameSound() { m_pSound = NULL; m_p...
Взаимодействие объектов классов звуковой системы и звукового фрагмента
На Рисунок 7.10 показано взаимодействие объектов и взаимоотношения между классом звуковой системы и классом звукового фрагмента. В верхней части рисунка показано как интерфейсы зхагрузчика и испо...
Пример использования класса звуковой системы
Как насчет примера программы, которая использует рассмотренный только что класс? Загрузите с компакт-диска проект с именем DSound_SoundSystem и следуйте за мной дальше. Рассматриваемый пример сост...
Окно программы DSound_SoundSystem
Полагаю, что окно на Рисунок 7.11 нельзя сравнивать с экранами из игры Warcraft II, но тем не менее это настоящая программа! Фактически в программе нет никаких изображений для разглядывания. Но т...
Инициализация класса звуковой системы
Не будем тратить бумагу и рубить больше деревьев, чем требуется, так что без лишних проволочек перейдем к коду функции WinMain() в файле main.cpp. Там вы увидите вызов функции с именем bInitialize...
Воспроизведение звуковых фрагментов
Вернемся к циклу обработки сообщений Windows. В нем находится код, ожидающий пока не будет нажата левая или правая кнопки мыши. Как только произойдет одно из указанных событий, будет воспроизведен...
Работа программы использующей класс звуковой системы
На Рисунок 7.12 видно, что первой вызывается функция инициализации звуковой системы. Внутри этой функции программа вызывает функцию инициализации из класса SoundSystem. Затем для загрузки двух зв...
Использование класса звуковой системы в меню
Вы помните программу с меню игры Battle Armor, которую я описывал в 6 главе? Пришло время добавить к ней звуки и музыку. Откройте находящийся на компакт-диске проект с именем D3D_MenuSounds и след...
Структура реализации звуковой системы в заголовочном файле проекта D3D_MenuSounds
В файл Main.cpp были добавлены вызовы функций для инициализации звуковой системы, загрузки звуковых файлов и их воспроизведения. Данные изменения иллюстрирует Рисунок 7.14....
Структура реализации звуковой системы в главном файле проекта D3D_MenuSoundsSound
Как видно на Рисунок 7.14 при инициализации звуковой системы происходит обращение к методу инициализации объекта звуковой системы. Затем этот же объект используется для загрузки звуковых файлов....
Итоги
Вспомните следующие моменты, относящиеся к звуковому сопровождению: DirectSound предоставляет низкоуровневый доступ к звуковой аппаратуре. DirectMusic предоставляет больше возможностей, чем Direct...
Проектирование подразделений
Если вам придется выбрать общие признаки для описания подразделений, какими они будут? Я думаю, что приведенный ниже список может служить хорошей отправной точкой: Название. Способ передвижения. С...
Название подразделения
Очевидно, сперва следует выбрать название подразделения. Если ваша игра относится ко Второй Мировой войне, вы можете использовать названия «Танк Т-34» или «Танк "Тигр"». Возможно, сюжет...
Способ передвижения
Как перемещается подразделение? Летает ли оно, плавает, перемещается в космосе или может использовать все эти три способа? Это очень важный вопрос ответ на который влияет на стратегию использовани...
Передвижение по земле
Любая боевая единица у которой есть колеса, гусеницы или ноги обычно классифицируется как наземная. Наиболее часто встречающимися наземными подразделениями являются пехота, танки и бронетранспорте...
Передвижение по воздуху
Если вы играете в стратегическую игру на стороне Соединеных Штатов, скорее всего у вас будут мощные военно-воздушные силы. Передвижение по воздуху применимо ко всему, что может летать. Будь это ве...
Передвижение по воде
Морские подразделения могут перемещаться только по воде. В зависимости от игры это может быть ограничивающим фактором. Лично я всегда наслаждаюсь хорошей морской битвой. Есть два основных типа мор...
Полеты в космосе
Космические подразделения могут перемещаться во внешнем пространстве. Я не видел игры в которой бы космические войска использовались вместе с подразделениями других перечисленных типов, но не гово...
Скорость передвижения
Скорость передвижения подразделений очень важна для выбора игроком стратегии использования войск в игре. Обычно подразделения, оборудованные тяжелыми вооружениями, передвигаются медленнее, чем лег...
Скороость передвижения
На Рисунок 8.4 изображены танк и космический корабль. Игровое поле представлено четырьмя блоками, длина каждого из которых равна единице. Космический корабль за каждый такт игры перемещается на 0...
Тип атаки
Вы должны не только учесть объем наносимого боевой единицей ущерба, но также и подумать о том, каким именно способом этот ущерб будет наноситься. Будет ли подразделение выпускать во врага ракеты,...
Два типа подразделений используют один тип атаки
На Рисунок 8.5 оказаны легкий и средний танк, которые используют один и тот же тип атаки. Если вы используете данный метод, вам достаточн изменить тип атаки, и эти изменения будут действовать для...
Тип защиты
Каждому преступлению соответствует наказание. Так что для каждого типа атаки должен быть тип защиты, верно? Ладно, не всегда, но это утверждение можно принять в качестве отправной точки. Так или и...
Два подразделения с различными типами защиты
На Рисунок 8.6 видно, что привычные персонажи совместно используют один и тот же тип атаки. Отличие в том, что они используют два различных типа защиты. Вы можете подумать, что это приведет к лиш...

Введение в POSIX'ивизм перейти








Начало    


Книжный магазин