Информатика и образование
  Мобильная версия сайта            
               
[Главная] [Новости]
[Статьи]
[Проекты]
[Ссылки]
[Автор]
               
    [Архив новостей]        
               
  [Форум] на форуме можно задать вопрос, посмотреть ответы на часто задаваемые вопросы  
       
  Здравствуйте! Вы попали на информационно-образовательный сайт посвященный информатике, информационным технологиям и компьютерным играм. Подробнее о целях и задачах сайта в разделе Главная. [English version of this page here...]    
       
  [Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi]    
  [Разработка компьютерной игры] [Пример игры Donuts3D] [Delphi DirectX]    
       
  Эмулятор электронной игры Электроника ИМ-02 "Ну, Погоди!"    
       
  триал-версия, 1,34 Mb   скачайте полную версию игры, зарегистрируйтесь и получите бесплатно полный исходный код игры для компиляции в delphi 7 или 2006 и уроки delphi directx 8.1 содержащие статьи по созданию собственной 2D/3D игры в среде delphi directx    
       
  Урок 3 Оконный и полноэкранный режимы работы D3D-приложения    
       
  О том, что потребуется для данного урока читайте в основном разделе - уроки delphi directx 8.1    
       
  Далее у читателя подразумевается наличие базовых знаний языка Delphi.    
       
  [назад] [страница 3] [далее] [к содержанию]    
       
  Ответим на вопросы заданные на предыдущей странице    
       
  Судя по исходному коду оригинальных примеров из DXSDK8, 9 правильно вызывать Clear до BeginScene ... EndScene, а не между этими методами. Возможно это влияет на производительность. Для простых примеров это может быть и не заметно, но в "тяжелых" приложениях это возможно даст некоторый прирост.    
       
 

Ответ на второй вопрос:

procedure CMyD3DApplication.DrawGameScene;
begin
if backImage <> nil then
{backImage.Draw2(0, 0, 0, 0.83, 1,
DrawD3DImage2D_Filtered, 255);}

backImage.Draw(DrawD3DImage2D_Filtered, 255);

end;

теперь остается выяснить почему не работает backImage.Draw2

 

   
       
 

Если выполнить отладку и заглянуть в модуль D3DGUI.pas метод function TD3DImage2D.Draw2(x, y, z: Single; fXScale, fYScale: Single;
Flags: Cardinal; Alpha: Byte; UsePatterns: Boolean = False): HResult;

то, видно, что структура vp: TD3DViewport8;

при вызове метода m_pd3dDevice.GetViewport(vp);

дает совершенно необъяснимые размеры окна Viewport

Если протестировать вызов данного метода в коде примера VCLTex модуль VCLTexUnit.pas внутри метода CMyD3DApplication.InitDeviceObjects

то результат будет тот же.

Таким образом решением является выяснение причины по которой вызов метода запроса параметров рабочей области отрисовки дает такие результаты.

Та же проблема при выводе масштабируемого текста D3DFont.pas CD3DFont.DrawTextScaled

Почему же в примере FullscreenMode всё работает как надо?

 

   
       
 

Ответ на этот вопрос Вы найдете проработав наш следующий - 4 урок, посвященный разработке класса D3D-приложения.

А коротко ответ на него звучит так -

   
       
 

модуль D3DApp.pas, метод CD3DApplication.Initialize3DEnvironment

// Create the device
{//**
hr := m_pD3D.CreateDevice(m_dwAdapter, pDeviceInfo^.DeviceType,
m_hWndFocus, pModeInfo^.dwBehavior, m_d3dpp,
m_pd3dDevice);
}

hr := m_pD3D.CreateDevice(m_dwAdapter, pDeviceInfo^.DeviceType,
m_hWndFocus,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
m_d3dpp,
m_pd3dDevice);

В чём же причина? Если заглянуть в документацию по DirectX 8 ,то в описании IDirect3D8::CreateDevice вы найдете список значений параметра BehaviorFlags

среди них D3DCREATE_PUREDEVICE = $10; и D3DCREATE_HARDWARE_VERTEXPROCESSING = $40; именно то значение, которое имеет данный флаг если использовать строку кода, которая показана закомментированной (зеленого цвета)

Приведенный чуть ниже код исправляет данный недостаток! Причина объяснена в документации по DirectX 8 -

D3DCREATE_PUREDEVICE
Specifies that Direct3D does not support Get* calls for anything that can be stored in state blocks. It also tells Direct3D not to provide any emulation services for vertex processing. This means that if the device does not support vertex processing, then the application can use only post-transformed vertices.

Т. е. установка данного флага не позволяет вызывать методы Get* и требует использования только пост-трансформированных вершин. Метод GetViewport как раз и не выдает при этом нужной информации!

   
       
       
       
       
  [назад] [страница 3] [далее] [к содержанию]    
       
       
       
       
       
  по всем вопросам пишите на megainformatic@mail.ru или оставьте сообщение на форуме    
       
 

 

Обновления и новости о развитии Delphi DirectX проекта
смотри на сайтах:

http://www.megainformaticsite.pochta.ru

http://www.megainformatic.boom.ru

http://www.megainformatic.narod.ru

 

   
       
     
 

Cвои пожелания, вопросы или заметки отправляйте на:

megainformatic@mail.ru или пишите на форуме

 
     
   Обмен ссылками  
     
     
             
 
 
         
(с) МЕГА ИНФОРМАТИК 2006-2009
Hosted by uCoz