Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2009, 15:01   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Вопрос Проблема с функцией DX3DInit

Нашел исходник проекта по графике на DirectX. Написан он был для Delphi 2005, а у меня 2009-ая. При компилировании выдает ошибку:
E2033 Types of actual and formal var parameters must be identical
Подсвечивает строку (черточкой выделена позиция курсора):
Код:
if (DX3DInit(pD3D, pD3DDevice, pWnd, 800, 600, False|)<>true) then ...
Все параменты такие, какие нужны, только pWnd имеет тип HWND, а надо THandle. Хотя вроде это ж одно и тоже?
Вот сама функция:
Код:
function DX3DInit(var ppiD3D9: IDirect3D9;
   var ppiD3DDevice9: IDirect3DDevice9;
   hWnd: THandle;
   iWidth, iHeight: Integer;
   var bFullScreen: Boolean):Boolean;
var
 d3dpp:TD3DPresentParameters;
 iRes: Integer;
 wndRect, clientRect: TRect;
 d3ddm : TD3DDISPLAYMODE;
 Flags: DWORD;
 hRes : HRESULT;
 Aspect : real;
 matProjection : TD3DMATRIX;
begin
 Result:= false;

 ppiD3D9:=Direct3DCreate9(D3D_SDK_VERSION);
 if ppiD3D9=nil then
  exit;

 // Заполняем основные параметры представления
 ZeroMemory(@d3dpp, sizeof(d3dpp));

 d3dpp.BackBufferWidth := iWidth;
 d3dpp.BackBufferHeight := iHeight;

 // Запрос на отображение в полноэкранном режиме
 if (bFullScreen=false) then
  iRes:=MessageBox(hWnd, 'Use fullscreen mode?', 'Screen', MB_YESNO or MB_ICONQUESTION)
 else
  iRes := IDYES;

 if(iRes = IDYES) then
  begin
   //////////////////////////////////////////////////////////
   // Полноэкранный режим
   //////////////////////////////////////////////////////////
	 // Установка параметров полноэкранного режима
   d3dpp.BackBufferFormat := D3DFMT_R5G6B5;
	 d3dpp.SwapEffect       := D3DSWAPEFFECT_FLIP;
	 d3dpp.Windowed         := FALSE;
   d3dpp.FullScreen_RefreshRateInHz := D3DPRESENT_RATE_DEFAULT;
   d3dpp.PresentationInterval := D3DPRESENT_INTERVAL_DEFAULT;
  end
 else
  begin
   //////////////////////////////////////////////////////////
	 // Оконный режим
   //////////////////////////////////////////////////////////
   GetWindowRect(hWnd, &wndRect);
   GetClientRect(hWnd, &clientRect);

	 iWidth := iWidth + (wndRect.right-wndRect.left)  - (clientRect.right-clientRect.left);
	 iHeight := iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top);

	 MoveWindow(hWnd, wndRect.left, wndRect.top, iWidth, iHeight, TRUE);

	 // Получить формат пикселя
	 ppiD3D9.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);

	  // Установка параметров
	 d3dpp.BackBufferFormat := d3ddm.Format;
	 d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD;
	 d3dpp.Windowed := TRUE;
  end;

 Flags := D3DCREATE_MIXED_VERTEXPROCESSING;

 // Создать 3D устройство
 hRes := ppiD3D9.CreateDevice(
	  D3DADAPTER_DEFAULT,
	  D3DDEVTYPE_HAL, hWnd, Flags,
	  @d3dpp, ppiD3DDevice9);
 if (FAILED(hRes)) then
	  exit;

 // Установить перспективу
 Aspect := d3dpp.BackBufferWidth / d3dpp.BackBufferHeight;
 D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0, Aspect, 0.1, 2000.0);
 ppiD3DDevice9.SetTransform(D3DTS_PROJECTION, &matProjection);

 ppiD3DDevice9.SetRenderState(D3DRS_LIGHTING, DWORD(FALSE));

 Result:=true;
end;
k1r1ch вне форума Ответить с цитированием
Старый 08.09.2009, 15:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

pD3DDevice что это?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.09.2009, 15:29   #3
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Восклицание

ppiD3D9 - это IDirect3D9 из библиотеки Direct3D9,
ppiD3DDevice9 - это IDirect3DDevice9 из той же библиотеки.
Все внутренние переменные функции, начинающиеся на 'TD3D' тоже из этой библиотеки.
k1r1ch вне форума Ответить с цитированием
Старый 08.09.2009, 15:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а если так:
Код:
var D3Device:IDirect3DDevice9
begin
if (DX3DInit(pD3D, D3DDevice, pWnd, 800, 600, False|)<>true) then ...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.09.2009, 15:46   #5
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Сообщение

Вот весь исходник программы, переменные уже и так объявлены. В программе как бы нету форм, код прямо в самом окне приложения.
Код:
program TemplateDirect3D;

uses
  windows,
  messages,
  Direct3D9,
  dxfunc;

var
 wc   : TWndClassEx;
 pWnd : THandle;
 pMsg : TMsg;

 pD3D: IDirect3D9=nil;
 pD3DDevice: IDirect3DDevice9=nil;


procedure Init;
begin
 if (DX3DInit(pD3D, pD3DDevice, pWnd, 800, 600, False)<>true) then
  begin
	 MessageBox(pWnd, 'Ошибка инициализации DirectX?', 'Error', MB_OK);
	 exit;
  end;
end;

function WindowProc(wnd: HWND; Msg: Integer; wParam: wParam; lParam: lParam): Lresult; stdcall;
begin
 Result:=0;

 case msg of
  WM_CREATE:
   begin
   end;
  WM_DESTROY:
   begin
		pD3DDevice := nil;
		pD3D := nil;
    PostQuitMessage(0);
    exit;
   end;
 else
  Result:=DefWindowProc(wnd,msg,wparam,lparam);
 end;
end;

begin
 wc.cbSize       := sizeof(wc);
 wc.lpfnWndProc  := @WindowProc;
 wc.cbClsExtra   := 0;
 wc.cbWndExtra   := 0;
 wc.hInstance    := HInstance;
 wc.hCursor      := LoadCursor(0, IDC_ARROW);
 wc.hbrBackground:= COLOR_BTNFACE+1;
 wc.lpszMenuName := nil;
 wc.lpszClassName:= 'delphi_directdraw';
 RegisterClassEx(wc);

 pWnd := CreateWindowEx(WS_EX_APPWINDOW, 'delphi_directdraw', 'Delphi DirectX Demo',
    WS_OVERLAPPED or WS_SYSMENU, 0, 0, 250, 130, 0, 0,
    Hinstance, nil);

 Init;

 ShowWindow(pWnd, SW_SHOW);
 while GetMessage(pMsg, 0, 0, 0) do
  begin
   TranslateMessage(pMsg);
   DispatchMessage(pMsg);
  end;
end.
k1r1ch вне форума Ответить с цитированием
Старый 08.09.2009, 16:11   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все понял ошибку...
добавьте переменную:
Код:
FullScreen:boolean=false;
и её подставьте в последний аргумент.
Код:
DX3DInit(pD3D, pD3DDevice, pWnd, 800, 600, FullScreen)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.09.2009, 16:29   #7
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Радость

Ааааа... Раз var, то это запись в переменную! Точно! Спасибо огромное, все заработало!
k1r1ch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с функцией Replace... Oooleg Microsoft Office Excel 7 02.09.2009 05:22
проблема с рекурсивной функцией world12_tk Помощь студентам 2 04.03.2009 20:57
Проблема с функцией замены... dast Microsoft Office Excel 6 09.10.2008 20:30
проблема с функцией atoi Darw1n Общие вопросы C/C++ 2 08.10.2008 23:21