Как создать игру ? - Программируем сами. Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше. |
||
[содержание] [назад] [страница 1] [далее] | ||
Vertices - Вершины - страница 1 | ||
Итогом вставки новой созданной иконки должно стать для Вас сохранение изменений в проект (кнопка Save All на панели инструментов MSVS) и выполнением сборки проекта - по клавише [F7]. Еще раз напомню, что для сборки отладочной версии Debug нужно выбрать соответствующую конфигурацию проекта - в панели инструментов есть соответствующий выпадающий список. Release - конфигурация отличается отсутствием отладочной информации, поэтому отлаживать приложение в таком режиме сборки нельзя. Зато когда Вы отловите все ошибки в коде, тогда можно создать окончательный релиз. |
||
Если Вы уже вдоволь наигрались с проектом CreateDevice - сохраняем все внесенные изменения и закрываем проект File > Close Solution. Переходим к примерам Vertices, Matrices, Lights, Textures, Meshes |
||
Все настойки в этих проектах нужно делать абсолютно аналогично, как это описывалось на протяжении наших предыдущих уроков, а более конкретно в уроке - Самый первый шаг - страница 3 | ||
В примере Vertices рассматривается как работать с вершинами в 3d-пространстве. Теперь уже наше приложение будет выполнять более полезную работу - выведет на экран разноцветный треугольник. |
||
По сравнению с предыдущим примером CreateDevice здесь уже рассматривается как создается и инициализируется вершинный буфер для модели треугольника. Треугольник хоть и плоский, но это уже модель, в примере Matrices показано как создать его вращение вокруг своей оси (по оси Y). | ||
Функция wWinMain включает использование новой функции - //
Create the vertex buffer //... } другое важное отличие - видоизменен цикл обработки сообщений, теперь он выглядит как //
Enter the message loop Т. е. если сообщения поступают в приложение, они обрабатываются, если нет - выполняется функция Render - другими словами отрисовка выполняется во время нахождения приложения в состоянии бездействия Idle - это и есть то состояние, когда нет системных сообщений, адресованных Вашему приложению. |
||
Функция InitVB HRESULT
InitVB() //заметьте, что цвет каждой вершины в формате AARRGGBB задается именно здесь! //о
формате задания цвета и определении конкретного цвета мы говорили в уроке
- CreateDevice страница 2
// Создаем вершинный буфер. Здесь мы выделяем достаточно
памяти для вершин
// Теперь мы заполняем вершинный буфер. Для этого
вызываем Lock() для VB
return S_OK; |
||
Функция Cleanup теперь включает освобождение объекта вершинного буфера. Функция Render включает новый код для рисования модели треугольника - //
начало сцены //
шагов. Мы передаем вершины в поток, поэтому первое - это определение
// Полнофункциональные, настраиваемые вершинные шейдеры - это //
выполняет фактическое рисование
// конец сцены |
||
Функция MsgProc не включает обработки сообщения WM_PAINT, потому что все d3d-приложения должны выполнять отрисовку находясь в состоянии Idle. | ||
Обратите внимание также на начало модуля Vertices.cpp //----------------------------------------------------------------------------- //
структура определяющая собственный тип вершин // наш настраиваемый тип вершин FVF, который определяет какой тип вершин
// используется для их описания |
||
Чтобы проверить насколько Вам ясно как работать с вершинами - попробуйте вывести вместо треугольника - квадрат. Цвета вершин также измените. | ||
Сначала посмотрите на приведенный рисунок и определите как были описаны координаты для треугольника: 150.0f, 50.0f - это вершина, отмеченная на рисунке цифрой 1, 250.0f, 250.0f - вершина номер 2 и 50.0f, 250.0f - вершина номер 3. Заметьте, что вершины определены в порядке обхода по-часовой стрелке. Это правило для определения видимых граней модели. Если вершины оказываются повернуты к экрану той гранью, где они следуют против часовой стрелки, то такая грань считается невидимой для зрителя стороной и не отрисовывается ! |
||
Теперь можно легко определить вершины для нашего квадрата - CUSTOMVERTEX
vertices[] = { 250.0f, 50.0f, 0.5f, 1.0f, 0xff00ff00, }, { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, {
50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, |
||
Однако даже правильно изменив количество вершин с 3 на 4 и правильно указав это число в строке кода if(
FAILED( g_pd3dDevice->CreateVertexBuffer( 4 * sizeof( CUSTOMVERTEX
), И указав количество отрисовываемых примитивов в функции Render в строке - g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 ); в количестве 2 вместо 1 |
||
Результатом будет - | ||
А всё дело в том, что D3D-приспособлен понимать только треугольные грани - состоящие из треугольников. Это сделано из-за того, что три вершины образующие треугольную грань всегда находятся в одной плоскости и следовательно так проще обсчитывать прорисовку сложных моделей. | ||
Значит нам, для создания модели квадрата, состоящего из 2х треугольных граней нужно использовать не 4, а 6 вершин - | ||
CUSTOMVERTEX
vertices[] = { 250.0f, 50.0f, 0.5f, 1.0f, 0xff00ff00, }, { 250.0f, 250.0f, 0.5f, 1.0f, 0xff0000ff, }, { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xffffff00, }, { 50.0f, 50.0f, 0.5f, 1.0f, 0xff0000ff, },
|
||
Важен и порядок, в котором определена вторая тройка вершин. Если они будут определены в другом порядке, то вторая грань (второй треугольник) выведен не будет. Попробуйте изменить порядок второй тройки вершин и убедитесь в этом сами. | ||
На рисунке также отчетливо видно какая из вершин в какой цвет окрашена, так что будет более понятно где и какая вершина. На первых порах задайте для каждой из вершин свой цвет - тогда легче будет увидеть где нужная вершина. | ||
[содержание] [назад] [страница 3] [далее] | ||