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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2012, 18:22   #1
Klod
Пользователь
 
Регистрация: 09.02.2012
Сообщений: 42
По умолчанию Инициализация DirectX в C++ Builder 6

Здравствуйте. У меня проблема с инициализацией DirectX в C++ Builder: почитал в нете, нашёл способ - взял из папки C:/Windows/System32/ файлы d3d9.dll и d3dx9d.dll, потом с помощью утилиты impdef.exe получил файлы формата .def, затем эти файлы с помощью утилиты implib.exe из файлов .def сделал файлы .lib . Потом эти либы переместил в папку с проэктом, и добавил их в проект (Project->AddProject...)
В Билдере кинул на форму кнопку, и в обработчик события написал:
IDirect3D9 *pD3D = NULL;

на что мне выдало ошибку Undifined symbol

В чём ошибка? Что я неправильно сделал?
Klod вне форума Ответить с цитированием
Старый 04.04.2012, 18:49   #2
Марат05
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 72
По умолчанию

Ошибка не в соответствии типов! Также проверьте в правильную библиотеку добавили ли вы - эти компоненты!
Марат05 вне форума Ответить с цитированием
Старый 04.04.2012, 19:01   #3
Марат05
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 72
По умолчанию

я это уже писал, инициализацию.
Прошу обратить внимание на этот "dxfunc.cpp" компонент, многое значит в аналогичных программных операциях ----> dxfunc.cpp
А воти собственно говоря мой код:
Код:
#include "D:\InitDirect3D\stdafx.h"
#include "dxfunc.h"
// Функция инициализации Direct3D
HRESULT DX3DInit(IDirect3D9 **ppiD3D9, 
IDirect3DDevice9 **ppiD3DDevice9,
HWND hWnd, 
DWORD iWidth,
DWORD iHeight,
BOOL bFullScreen)
{
// Инициализация 
if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
return E_FAIL;
// Заполняем основные параметры представления
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = iWidth;
d3dpp.BackBufferHeight = iHeight;
// Запрос на отображение в полноэкранном режиме
int iRes;
if (!bFullScreen)
iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
else
iRes = IDYES;

if(iRes == IDYES)
{
//////////////////////////////////////////////////////////
// Полноэкранный режим
//////////////////////////////////////////////////////////
// Установка параметров полноэкранного режима
d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
d3dpp.Windowed = FALSE;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
} 
else 
{
//////////////////////////////////////////////////////////
// Оконный режим
//////////////////////////////////////////////////////////
RECT wndRect;
RECT clientRect;
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);

// Получить формат пикселя
D3DDISPLAYMODE d3ddm;
(*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
// Установка параметров
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = TRUE;
}
DWORD Flags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
//DWORD Flags = D3DCREATE_MIXED_VERTEXPROCESSING;
// Создать 3D устройство
HRESULT hRes;
if(FAILED(hRes = (*ppiD3D9)->CreateDevice(
D3DADAPTER_DEFAULT, 
D3DDEVTYPE_HAL, hWnd, Flags, 
&d3dpp, ppiD3DDevice9)))
return hRes;
// Установить перспективу
float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight;
D3DXMATRIX matProjection;
D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 0.1f, 1000.0f);
(*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);
(*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK;
}
HRESULT DX3DInitZ(IDirect3D9 **ppiD3D9, 
IDirect3DDevice9 **ppiD3DDevice9,
HWND hWnd, 
DWORD iWidth,
DWORD iHeight,
BOOL bFullScreen)
{
// Инициализация 
if((*ppiD3D9 = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
return E_FAIL;

// Заполняем основные параметры представления
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = iWidth;
d3dpp.BackBufferHeight = iHeight;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
// Запрос на отображение в полноэкранном режиме
int iRes;
if (!bFullScreen)
iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
else
iRes = IDYES;
if(iRes == IDYES)
{
//////////////////////////////////////////////////////////
// Полноэкранный режим
//////////////////////////////////////////////////////////
// Установка параметров полноэкранного режима
d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
d3dpp.Windowed = FALSE;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
} 
else 
{
//////////////////////////////////////////////////////////
// Оконный режим
//////////////////////////////////////////////////////////
RECT wndRect;
RECT clientRect;
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);
// Получить формат пикселя
D3DDISPLAYMODE d3ddm;
(*ppiD3D9)->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
// Установка параметров
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = TRUE;
}
DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;
// Создать 3D устройство
HRESULT hRes;
if(FAILED(hRes = (*ppiD3D9)->CreateDevice(
D3DADAPTER_DEFAULT, 
D3DDEVTYPE_HAL, hWnd, Flags, 
&d3dpp, ppiD3DDevice9)))
return hRes;

Последний раз редактировалось ACE Valery; 05.04.2012 в 16:37.
Марат05 вне форума Ответить с цитированием
Старый 04.04.2012, 19:01   #4
Марат05
Пользователь
 
Регистрация: 07.12.2010
Сообщений: 72
По умолчанию

Код:
// Установить перспективу
float Aspect = (float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight;
D3DXMATRIX matProjection;
D3DXMatrixPerspectiveFovLH(&matProjection, D3DX_PI/4.0f, Aspect, 2.0f, 1000.0f);
(*ppiD3DDevice9)->SetTransform(D3DTS_PROJECTION, &matProjection);

(*ppiD3DDevice9)->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK;
}
DWORD LoadMesh (char *filename, IDirect3DDevice9 *ppiD3DDevice9,
ID3DXMesh **ppMesh,
LPDIRECT3DTEXTURE9 **pMeshTextures,
char *texturefilename, 
D3DMATERIAL9 **pMeshMaterials
)
{
LPD3DXBUFFER pD3DXMtrlBuffer;
DWORD dwNumMaterials;
D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM,
ppiD3DDevice9, NULL, &pD3DXMtrlBuffer, NULL, &dwNumMaterials, ppMesh);
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
(*pMeshTextures) = new LPDIRECT3DTEXTURE9[dwNumMaterials];
(*pMeshMaterials) = new D3DMATERIAL9[dwNumMaterials];
for( DWORD i=0; i<dwNumMaterials; i++ )
{
// Копируем материал
(*pMeshMaterials) = d3dxMaterials.MatD3D;
// Создаем текстуру
if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
d3dxMaterials.pTextureFilename, &(*pMeshTextures))))
if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
texturefilename, &(*pMeshTextures))))
(*pMeshTextures) = NULL;
}
return dwNumMaterials;
}
bool LoadTexture(DWORD* text_buf, int iWidth, int iHeight, char* filename)
{
HANDLE hFile = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
if(hFile == INVALID_HANDLE_VALUE) 
return FALSE;
BITMAPFILEHEADER bmpfilehdr; 
DWORD dwRead;
if(!ReadFile(hFile, &bmpfilehdr, sizeof(bmpfilehdr), &dwRead, NULL))
return FALSE;
char* ptr=(char*)&bmpfilehdr.bfType;
if (*ptr!='B' || *++ptr!='M')
return FALSE;
BITMAPINFOHEADER bmpinfohdr;
if(!ReadFile(hFile, &bmpinfohdr, sizeof(bmpinfohdr), &dwRead, NULL))
return FALSE;
if (bmpinfohdr.biCompression!=BI_RGB)
return 0;
int iImageSize=bmpinfohdr.biSizeImage;
if (iImageSize==0)
iImageSize=((iWidth*4+3) & ~3)*iHeight;
BYTE* buf=new BYTE[iImageSize];
if(!ReadFile(hFile, buf, iImageSize, &dwRead, NULL))
return FALSE;
if (bmpinfohdr.biBitCount!=24)
return FALSE;
int bytesgiven=(iWidth*3+3) & ~3;
DWORD* btSurf = text_buf;
BYTE* imagebits = (BYTE*)(&buf[(iHeight-1)*bytesgiven]);
for (int i=0; i<iHeight; i++)
{
RGBTRIPLE* tlImage=(RGBTRIPLE*)imagebits;
for (int p=0; p<iWidth; p++)
{
*btSurf = (DWORD)((tlImage->rgbtBlue) | (tlImage->rgbtGreen << 8) | 
(tlImage->rgbtRed << 16) | (0xFF << 24));
tlImage++;
btSurf++;
}
imagebits -= bytesgiven;
}

delete [] buf;
return TRUE;
}

Последний раз редактировалось ACE Valery; 05.04.2012 в 16:37.
Марат05 вне форума Ответить с цитированием
Старый 04.04.2012, 21:46   #5
Klod
Пользователь
 
Регистрация: 09.02.2012
Сообщений: 42
По умолчанию

Я наверно не правильно выразился.
Твоя инициализация поможет мне потом. а сейчас я даже не могу воспользоваться функцией IDirect3D9, хотя у меня и подключены библиотеки. В visual C++ надо в cpp объявлять:
#include<d3d9.h>
#include<d3dx9d.h>
А в c++ Builder я не знаю как сделать доступными функции DirectX.
Как мне получить возможность испоьзовать функции DirectX в C++ Builder 6?
Klod вне форума Ответить с цитированием
Старый 05.04.2012, 13:42   #6
jaguar8989
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 16
По умолчанию

а не легче было скачать библиотеку DirectX`a и указать полный путь к папке с библиотеками DirectX?
...примерно так:
#include "C:\\DirectX_SDK_9.0\Lib\"
и header файлы в таком же стиле....

Последний раз редактировалось jaguar8989; 05.04.2012 в 13:49.
jaguar8989 вне форума Ответить с цитированием
Старый 05.04.2012, 15:24   #7
Klod
Пользователь
 
Регистрация: 09.02.2012
Сообщений: 42
По умолчанию

то есть готовые библиотеки есть в DirectX SDK 9.0?

Последний раз редактировалось Klod; 06.04.2012 в 08:51.
Klod вне форума Ответить с цитированием
Старый 06.04.2012, 11:44   #8
jaguar8989
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 16
По умолчанию

ну да)только необходимо качать не DirectX который принято ставить при установке игр, а DirectX_SDK...
jaguar8989 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инициализация DirectX AlexeyMikr Visual C++ 1 02.06.2011 07:03
Инициализация DirectX _-Re@l-_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 07.02.2011 16:38
Инициализация Directx 3d 4erk Win Api 9 30.06.2010 00:29
Инициализация DirectX Pedro Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 30.09.2009 21:06
DirectX SDK + BDS builder c++ 2006 Koshmarovsky Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 12.05.2009 17:33