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

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

Благодарности
Anons
Введение
Для кого предназначена эта книга
Краткий обзор
Первые стратегии реального времени
Utopia от Intellivision

Игровое поле
Земля
Здания
Океан
Корабли
Рыба, погода и пираты


Резюме
Populous от Bullfrog
Приманка
Строительство ландшафта

Первые популярные стратегии реального времени
Command Conquer от Westwood
История
Интерфейс
Экран радара
Индикаторы ресурсов
Объекты для постройки
Уровень энергии
Игровое поле
Технология

Баланс игры
Warcraft: Orcs Humans
StarCraft от Blizzard
Будущее стратегий реального времени
Широкомасштабные многопользовательские игры
Умные компьютеры
Первые стратегические игры
Warlords
Empire
Command H.Q.

The Seven Cities of Gold
X-COM: UFO Defense
Итоги

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

Архитектура программ Windows
Работа, управляемая событиями
События
Структура программы
Очередь событий
Функция WinMain()
Обработчик сообщений

Пишем первую программу для Windows
Начало работы с Visual C++ 6.0
Как создать проект
Рабочее пространство
Файлы ресурсов
Добавление исходных файлов в проект
Погружаемся и сталкиваемся с кодом
Включение файлов и прототипы функций
Внутреннее устройство функции WinMain()

Структура данных WNDCLASSEX
Функция RegisterClassEx()
Функция CreateWindowEx()

Функция ShowWindow()
Получение сообщений функцией GetMessage()
Трансляция сообщений функцией TranslateMessage()
Помещение сообщений в очередь функцией DispatchMessage()
Функция обработки сообщений
Компиляция и выполнение кода
Сюжет
Тема сюжета

Элементы сюжета
Сюжетная основа
Конечная цель сюжета
Расстановка целей
Пример для изучения Empire Earth
Описание событий
Начальные цели
Главные вехи
Заключительная цель
Боевые единицы

Стоимость боевых единиц
Скорость боевых единиц
Вычисление скорости боевых единиц
Броня боевых единиц
Вычисление обороноспособности
Очки повреждений
Огневая мощь боевых единиц
Скорострельность
Вычисление скорострельности
Тип повреждений

Специальные повреждения
Скорость оружия
Вычисление скорости снаряда
Управление ресурсами
Выберите, что вы будете пить
Определение ресурсов
Добыча ресурсов
Баланс ресурсов
Пример несбалансированности
Пример сбалансированности

Скорость добычи
Дерево технологий
Различные типы технологий
Технологии для инфраструктуры
Технологии для вооружений
Технологии для модернизации
Стоимость технологий
Игровая кампания
Редактор миссий
Цели миссий

Многопользовательская игра

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

Фаза идей
Создание наброска
Фаза определения требований
Фаза технической документации
Фаза разработки
Контроль исходного кода
Управление метками
Отслеживание ошибок

Отслеживание
Привязка к исходному коду
Метрики качества
Тестирование отдельных частей
Фаза тестирования
Фаза производства
Распространение
Условно-бесплатные программы
Сайты аукционов
Издатели
Краткий обзор
Основы блочной графики
Что такое блок?
Зачем использовать блоки?
Использование блоков для экономии памяти
Применение блоков для повторного использования графики
Использование блоков для динамического содержимого
Как создавать блоки?
Выбор размера блоков
Определение необходимых блоков

Как отображать блоки?
Отображение двухмерной сетки
Как вычислить местоположение в массиве
Как вычислить видимую позицию
Отображение изометрических блоков
Отображение трехмерных блоков
Многослойные блоки
Добавление деталей к блокам
Переходные блоки

Блоки с изображениями дорог
Как добавить трехмерные деревья
Анимированные блоки
Редактирование и хранение блоков
Хранение блоков в двухмерном массиве
Хранение многослойных блоков
Создание класса для представления блоков

Заголовок класса
Реализация класса
Пример использования класса
Свойства блоков
Проходимость
Возвышенность
Яркость

Смещение
Отображение блоков
Отображение двухмерных блоков
Архитектура проекта D3DFrame_2DTiles
Заголовочный файл Main.h
Файл программы Main.cpp

Отображение двухмерных изометрических блоков
Архитектура проекта D3DFrame_Isometric2DTiles
Заголовочный файл Main.h
Файл программы Main.cpp
Отображение двухмерных изометрических блоков со спрайтами
Архитектура проекта D3DFrame_Isometric2DSpriteTiles
Заголовочный файл Main.h

Файл программы Main.cpp
Зачем использовать спрайты?
Отображение трехмерных блоков
Архитектура проекта D3DFrame_3DTiles
Заголовочный файл Main.h
Файл программы Main.cpp
Загрузка трехмерных моделей
Точечный источник света
Визуализация трехмерных моделей

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


Краткий обзор
Определение требований к интерфейсу
Активные зоны и графика
Детализация схемы интерфейса
Взаимосвязь шаблонов интерфейса
Звуковое оформление интерфейса
Состояния интерфейса

Раскадровка интерфейса
Удобство и простота интерфейса
Щелчки мышью и взаимодействие с интерфейсом
Сложность навигации по меню
Согласованность интерфейса
Двухмерная графика в Direct3D
Архитектура проекта D3D_TitleScreen
Заголовочный файл Main.h
Ключевые типы данных Direct3D
Структура данных настраиваемого формата вершин (FVF)

Данные местоположения
Данные нормали
Данные текстуры
Определение формата вершины
Прототипы функций
Файл программы Main.cpp
Функция WinMain()
Вычисление смещения клиентской области
Функция InitD3D()
Создание объекта Direct3D

Настройка параметров отображения
Создание устройства трехмерной визуализации
Создание устройства трехмерной визуализации - 2
Настройка среды визуализации

Функция vInitInterfaceObjects()
Создание буфера вершин
Блокировка буфера вершин
Заполнение буфера вершин данными
Загрузка текстур
Функция vRender()
Функция vDrawInterfaceObject()

Горячие точки, или как я научился любить щелчки мыши
Обнаружение активных зон
Архитектура проекта D3D_MouseZones
Заголовочный файл Main.h
Глобальные данные активных зон
Файл программы Main.cpp
Функция WinMain()

Функция vSetupMouseZones()
Функция MouseZoneClass::vFreeZones()
Функция MouseZoneClass::vInitialize()
Функция MouseZoneClass::iAddZone()
Функция vCheckInput()
Управление щелчками мыши
Вычисление смещения клиентской области окна на рабочем столе
Вычисление местоположения указателя мыши
Функция MouseZoneClass::bCheckZones()
Обнаружение сообщений кнопок мыши

Выход из программы
Динамическое отображение меню
Заголовочный файл MouseZoneClass.h
Структура данных stHotSpot
Закрытые члены данных класса MouseZoneClass
Функции класса MouseZoneClass
Файл MouseZoneClass.cpp
Функция MouseZoneClass::MouseZoneClass()
Функция MouseZoneClass::vInitialize()

Функция MouseZoneClass::vFreeZones()
Функция MouseZoneClass::iAddZone()
Функция MouseZoneClass::iRemoveZone()
Функция MouseZoneClass::bCheckZones()
Подсветка пунктов меню
Архитектура проекта D3D_MouseZoneHighlights
Заголовочный файл Main.h
Файл программы Main.cpp
Как определить подсвечиваемую активную зону
Как определить подсвечиваемую активную зону - 2

Как создать подсвечиваемую активную зону
Как отобразить подсветку активной зоны

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

Звуковые API
Архитектура DirectMusic
Загрузчик DirectMusic
Исполнитель DirectMusic
Сегменты DirectMusic
Как воспроизвести файл WAV
Проект DMusic_PlaySound

Заголовочный файл Main.h
Файл программы Main.cpp
Функция bInitializeSoundSystem()
Как инициализировать COM
Создание интерфейса загрузчика
Создание интерфейса исполнителя
Инициализация аудиосистемы
Как регулировать громкость
Загрузка звукового файла

Как загрузить сегмент
Функция vPlaySound()
Воспроизведение звука
Как воспроизвести файл MIDI
Как воспроизвести файл MP3
DirectShow
Проект DShow_PlayMP3
Заголовочный файл Main.h
Граф фильтров
Управление аудиовизуальным потоком

События аудиовизуального потока
Позиционирование аудиовизуального потока
Файл программы Main.cpp
Функция bPlayTitleMusic()
Инициализация DirectShow
Загрузка музыкального файла
Установка темпа воспроизведения
Воспроизведение музыки
Перехват фоновых событий
Функция vCheckMusicStatus()

Проверка кода события
Остановка музыки
Перемотка музыки
Запуск музыки
Реализация классов звуковой системы
Класс звуковой системы
Определение класса звуковой системы
Определение класса звукового фрагмента
Реализация класса звуковой системы
Деструктор SoundSystem::~SoundSystem()

Функция SoundSystem::hrInitSoundSystem()
Функция SoundSystem::hrLoadSound()
Функция SoundSystem::hrPlaySound()
Реализация класса звукового фрагмента
Пример использования класса звуковой системы
Инициализация класса звуковой системы
Воспроизведение звуковых фрагментов
Использование класса звуковой системы в меню

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

Проектирование подразделений

Название подразделения
Способ передвижения
Передвижение по земле
Передвижение по воздуху
Передвижение по воде
Полеты в космосе
Скорость передвижения
Тип атаки
Тип защиты
Программирование шаблона

Класс CUnitDefense
Члены данных класса CUnitDefense
Коэффициенты защиты
Скорость восстановления
Название защиты
Методы класса CUnitDefense
Класс CUnitOffense
Члены данных класса CUnitOffense

Коэффициенты поражения
Радиус взрыва
Скорость снаряда
Дальнобойность
Название типа атаки
Методы класса CUnitOffense
Класс CUnitMovement
Члены данных класса CUnitMovement

Ускорение и торможение
Скорость поворота
Методы класса CUnitMovement
Класс CUnitAnimation
Члены данных класса CUnitAnimation
Анимация ожидания
Анимация передвижения
Анимация атаки

Анимация гибели
Начальный кадр анимации
Методы класса CUnitAnimation
Функция CUnitAnimation::vSetRenderDevice()
Функция CUnitAnimation::vLoadTextures()
Цвета владельца

Функция CUnitAnimation::vReset()
Класс CTexture
Члены данных класса CTexture
Методы класса CTexture
Функция CTexture::vLoad()
Функция CTexture::vRelease()
Функция CTexture::vSetRenderDevice()
Класс CUnit
Члены данных класса CUnit
Члены данных класса CUnit - 2

Методы класса CUnit
Функция CUnit::vReset()
Функция CUnit::vSetBaseValues()
Функция CUnit::vSetPosition()
Класс CUnitManager
Загрузка базовых типов
Функция CUnitManager::iLoadBaseTypes()

Функция CUnitManager::ptrGetDefenseType()
Создание подразделений
Функция CUnitManager::iAddUnit()
Управление текстурами
Рисование подразделений
Функция vDrawUnit()
Использование альфа-канала
Отображение активных подразделений

Обновление кадра анимации
Обработка ожидающих подразделений
Обработка поворачивающих подразделений
Обработка атакующих подразделений
Обработка гибнущих подразделений
Обработка перемещающихся подразделений
Загрузка и создание подразделений

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

Обзор DirectInput

Интерфейс IDirectInput8
Интерфейс IDirectInputDevice8
Ввод с клавиатуры
Проект DInput_Simple
Инициализация DirectInput
Функция iInitDirectInput()
Функция iInitKeyboard()
Буферизованный ввод с клавиатуры
Функция IDirectInputDevice8::SetProperty()
Установка формата данных клавиатуры

Установка уровня кооперации
Захват клавиатуры
Раскладка клавиатуры
Чтение данных клавиатуры
Функция iReadKeyboard()
Определение состояния DIK
Преобразование кода DIK в код ASCII
Ввод текста в игре
Навигация по меню
Активация ввода текста

Обработка текстового ввода
Отображение введенного текста
Интерфейс шрифта
Функция ID3DXFont::DrawText()

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

Основы редактирования карт
Компоненты редактора карт
Область редактирования

Область выбора блоков
Мини-карта
Область вывода информации
Просмотр карты
Глобальные переменные карты
Ход выполнения программы
Генерация случайной карты
Навигация по карте
Загрузка изображений блоков
Визуализация блоков

Редактирование карты
Программирование панели инструментов
Отображение блоков на панели инструментов
Сохранение и загрузка карты
Функция SaveMap()

Функция LoadMap()
Отображение мини-карты
Функция vCreateMinimap()
Функция vRenderMinimap()
Алгоритмы генерации карт
Функция vGenerateMap()
Методы генерации карт
Многослойные карты

Изменения в заголовочном файле
Многомерный массив
Функция смены слоя
Переменные для новых кнопок
Изменения в функции vCreateToolbar()
Функция vChangeLayer()
Изменение процедур сохранения и загрузки
Изменения в функции vRender()
Изменения в функции vCheckMouse()

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

Обзор трехмерной анимации
Сцена
Объекты
Фиксированные объекты
Ключевые кадры
Автоматическая вставка промежуточных кадров
Анимационные наборы
Импорт содержимого
Экспорт из 3ds max
Основы моделирования

Загрузка объекта
Программа Convert 3DS
Редактирование анимации
Готовые редакторы анимации
Программирование собственного редактора
Интерфейс редактора анимации
Команды редактора анимации
Команды работы с кадрами
Команды работы с объектами

Команды воспроизведения
Команды работы с файлами
Процесс редактирования
Сохранение и загрузка
Программирование редактора
Элементы управления программы D3D_AnimationEditor
Проект D3D_AnimationEditor
Класс C3DAnimation
Методы класса C3DAnimation
Члены данных класса C3DAnimation

Структура stKeyFrame
Реализация методов класса C3DAnimation
Конструктор класса C3DAnimation
Деструктор класса C3DAnimation
Функция C3DAnimation::vReset()
Функция C3DAnimation::vNewFrame()
Функция C3DAnimation::iNextFrame()
Функция C3DAnimation::iPrevFrame()
Функция C3DAnimation::iStartFrame()
Функция C3DAnimation::iNewObj()

Функция C3DAnimation::vUpdateTrans()
Функция C3DAnimation::vUpdateRot()
Функция C3DAnimation::vUpdateScale()
Функция C3DAnimation::vSave()
Функция C3DAnimation::vLoad()
Функция C3DAnimation::vSet3DDevice()
Программа D3D_AnimationEditor
Функция vInitAnimation()
Функция vLoadObject()
Создание кадров

Выбор необходимого объекта
Изменение местоположения объекта
Добавление ключевых кадров
Управление с клавиатуры
Что еще можно сделать
Реализация анимации
Задача поиска пути

Простое решение
Поиск пути по алгоритму A*
Основы A*
Начало поиска
Вычисление стоимости узлов
Базовая стоимость узла
Стоимость относительно начального узла
Стоимость относительно цели
Общая стоимость
Поиск наилучшего узла

Продолжение поиска
Обратная трассировка для нахождения пути
Реализация в коде
Функция инициализации пути
Функция CPathFinder::bFindPath()

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

Основные сведения о частицах
Характеристики частиц

Изображение частиц
Движение частиц
Анимация частиц
Структура класса частиц
Класс CVector
Класс CParticle
Члены данных
Методы класса
Функция CParticle::vUpdate()
Функция CParticle::vUpdate() - 2

Реализация системы частиц
Структура проекта D3D_Particles
Инициализация частиц
Визуализация частиц

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

Сетевые соединения
Игра по локальной сети
BNC шаг вперед!
Соединения витой парой
Соединение через кросс-кабель

Сеть с концентратором
Сеть с коммутатором
Маршрутизаторы ворота в Интернет
Маршрутизаторы ворота в Интернет - 2
Сетевые протоколы
Протокол TCP/IP
Протокол UDP
TCP/IP против UDP
Пакеты
Задержка

Одноранговые сети
Сети клиент-сервер
Сравнение одноранговых сетей и сетей клиент-сервер
Сокеты и DirectPlay
Пример программирования сокетов
Программа Sockets_Receive
Включение заголовочного файла WinSock
Установка версии WinSock
Создание сокета
Поиск сервера по URL

Установка номера порта
Подключение к серверу
Отправка данных серверу
Получение данных от сервера
Закрытие сокета
Отключение сокетов
Программирование сетевых походовых игр
Ход выполнения походовой игры
Программа Sockets_TurnGame
Глобальные переменные программы Sockets_TurnGame

Функции программы Sockets_TurnGame
Функция vHost()
Функция vConnect()
Функция vTurnDone()
Функция vSendTurnMessage()
Функция vReceiveTurnMessage()

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


Adobe Photoshop
Создание снимков экрана с помощью Photoshop
Диалоговое окно создания нового изображения
Установка атрибутов изображения
Вставка изображения из буфера
Компоновка изображения
Сохранение изображения

Слои
Эксперименты со слоями
Перемещение слоев
Изменение порядка слоев
Изменение прозрачности слоя
Эффекты
Свойства слоя
Параметры смешивания
Падающая тень

Фильтры
Альфа-карты
Делаем альфа-карту
Вкладка Channels
Инструмент Magic Wand
Выбор фрагмента
Создание маски
Инвертирование маски
Приложение B. Ресурсы для разработчика

Двухмерная графика
Трехмерная графика
Сообщества разработчиков игр
Аппаратное обеспечение