DirectX 8. Начинаем работу с DirectX Graphics - [2]
>g_pD3D=Direct3DCreate8(D3D_SDK_VERSION);
Единственным параметром функции Direct3DCreate8 является UINT SDKVersion, который должен быть D3D_SDK_VERSION. Это необходимо для того, чтобы при компиляции программы были использованы правильные заголовочные файлы [*.h] (замечание: если после создания объекта были подключены новые адаптеры, необходимо повторно инициализировать объект Direct3D, чтобы использовать их). Если в процессе инициализации произошла ошибка, то Direct3DCreate8 возвращает NULL (т.е. пустой указатель).
Уже пора определиться, что же будет делать наша программа :).
После запуска она создаст и прорисует окошечко, в заголовке которого будет показано текущее разрешение графического адаптера, а в рабочей области — отрендеренная сцена. В данном примере сцена не будет содержать никаких объектов, поэтому отрендерится только темно-синий фон.
Заголовок окна ("window name" стоило перевести как "имя окна", но тогда как-то несолидно звучит :) ) будет содержаться в строке символов str (т.е. str указывает на первый символ строки). Чтобы сформировать str, необходимо узнать ширину (Width) и высоту (Height) текущего видеорежима, а затем воспользоваться стандартной Си'шной функцией sprintf(), которая осуществляет форматированный вывод в строку. Как же узнать ширину и высоту текущего видеорежима? Для этого воспользуемся методом IDirect3D8::GetAdapterDisplayMode, который возвращает текущий режим видеоадаптера в структуру D3DDISPLAYMODE. Затем из структуры "выуживаем" необходимые параметры Width и Height, формируем строку str. Остается только изменить заголовок нашего окна с помощью стандартной WinAPI функции SetWindowText():
>D3DDISPLAYMODE dm;
>//В переменной dm будет храниться текущий видеорежим
>//Заголовок нашего окна. Будет генериться в зависимости от текущего видеорежима
>char str[128];
>g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dm);
>Width=dm.Width;
>Height=dm.Height;
>sprintf(str," (D3D Init) Current adapter mode: [%dx%d]", Width, Height);
>SetWindowText(hWnd, str);
Наконец, займемся непосредственно инициализацией D3D. Как было сказано выше, нам понадобится переменная-структура типа D3DPRESENT_PARAMETERS. Опишем эту переменную и выделим для нее память:
>//Структура понадобится для создания D3DDevice
>D3DPRESENT_PARAMETERS p_p;
>ZeroMemory(&p_p, sizeof(p_p));
Меняя поля структуры p_p, мы можем гибко настраивать параметры нашего трехмерного приложения. На этой стадии определяется, будет ли наше приложение оконным или полноэкранным, задается частота обновления экрана (только для полноэкранного режима), необходимое количество бэк-буферов (BackBuffer) и т.д. Бэк-буфер — это область памяти для хранения одного неактивного в данный момент (т.е. визуально скрытого от пользователя) видеоэкрана. В бэк-буфер можно рендерить сцену, в то время, как пользователь видит на экране другую картинку, и практически моментально выводить содержимое бэк-буфера на экран.
Мы создаем оконное приложение (об этом говорит строка p_p.Windowed=TRUE;), поэтому необходимо установить формат бэк-буфера таким же, как и формат текущего видеорежима (как ты помнишь, он у нас хранится в переменной dm.Format). Поле SwapEffect задает способ обмена между франт-буфером (FrontBuffer, т.е. тот, который сейчас активен) и бэк-буфером. Существуют несколько значений этого параметра. Мы будем использовать D3DSWAPEFFECT_DISCARD ("discard" переводится с английского, как "сбрасывать", "отбрасывать"), т.е. после вывода на экран содержимое бэк-буфера заполняется "шумами" ("noise"). Реализуем задумки в программный код:
>p_p.BackBufferFormat = dm.Format;
>p_p.Windowed=TRUE;
>p_p.SwapEffect=D3DSWAPEFFECT_DISCARD;
Последний шаг, который осуществляет наша функция Init() — создание устройства. Для этого воспользуемся методом IDirect3D8::CreateDevice().
Укажем следующие параметры:
a. D3DADAPTER_DEFAULT — используется стандартный видеоадаптер
b. D3DDEVTYPE_REF — визуализация будет происходить исключительно программными средствами Direct3D
c. hWnd — собственно, идентификатор окна
d. D3DCREATE_SOFTWARE_VERTEXPROCESSING — обработка точек будет происходить исключительно программными средствами
e. &p_p — указатель на структуру, описывающую параметры создающегося устройства
f. &g_pd3dDevice — адрес указателя на интерфейс IDirect3DDevice8, который будет создан
Вот, что должно получиться:
>g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &p_p,&g_pd3dDevice);
Эта функция как раз рендерит сцену. Принцип ее действия:
a. Очищается бэк-буфер, и в него рендерится сцена (итого, в бэк-буфере окажется темно-синий экран, т.к. сцена не содержит объектов)
b. Происходит передача данных во франт-буфер
c. Содержимое франт-буфера "выбрасывается" на экран
Очистить сцену можно вызвав метод IDirect3DDevice8::Clear(). Его первые два параметра мы обнуляем, т.к. хотим очистить экран (на самом деле не экран, а рабочую область окна, но так проще писать :) ) целиком. Значение третьего параметра (D3DCLEAR_TARGET) говорит о том, что очистка должна происходить цветом, заданным четвертым параметром (в нашем случае D3DCOLOR_XRGB(30, 60, 120)). Последние два параметра в нашем случае игнорируются. Поэтому, пишем:
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.