| PMG https://forum.pmg.org.ru/ |
|
| Дирекс как класс https://forum.pmg.org.ru/viewtopic.php?f=2&t=86 |
Страница 1 из 1 |
| Автор: | GDX [ 22 сен 2005 19:58 ] |
| Заголовок сообщения: | Дирекс как класс |
Народ подскажите как зделать в приложение дирекс как класс, с помощью этого класса можна было инициализировать дирекс , рендерить сцены и т.д. |
|
| Автор: | MagicWolf [ 23 сен 2005 16:25 ] |
| Заголовок сообщения: | |
В каком смысле как сделать? Что вроде этого: class DX { init reset start stop } Или что-то другое? |
|
| Автор: | GDX [ 25 сен 2005 21:17 ] |
| Заголовок сообщения: | |
windows.cpp // --- Обязательный включаемый файл #include <windows.h> #include"Include.h" #include"Render.h" DXRender MainRender; LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // --- Глобальные переменные HINSTANCE hInst; // Дескриптор экземпляра приложения char ClassName[]="Window"; // Название класса окна char AppTitle[]="Application Win32"; // Заголовок главного окна bool fscreen=true; MSG msg; LPDIRECT3D9 pD3D = NULL; // Direct3D. Используется для создания Устройство рендеринга LPDIRECT3DDEVICE9 pDevice = NULL; // Устройство рендеринга D3DPRESENT_PARAMETERS d3dpp; // Параметры для создания Direct3D void Render() { if(pDevice == NULL) return; // Очистка и закраска фона в красный цвет. pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 0, 0), 3.0f, 0 ); // Начало отрисовки сцены. if(SUCCEEDED(pDevice->BeginScene())) { // Тут будем писать код для рисования. //.. // Конец отрисовки сцены. pDevice->EndScene(); } // Вывод из следующего буфера на экран. pDevice->Present( NULL, NULL, NULL, NULL ); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; // Структура для информации о класса окна HWND hWnd; // Дескриптор главного окна приложения hInst=hInstance; // Заполнение структуры WNDCLASS для регистрации класса окна. memset(&wc, 0, sizeof(wc)); wc.lpszClassName=ClassName; // Имя класса окон wc.lpfnWndProc=(WNDPROC)WndProc; // Адрес оконной функции wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса окон wc.hInstance=hInstance; // Экземпляр приложения wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Пиктограмма для окон wc.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор мыши для окон wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); // Кисть для окон wc.lpszMenuName=NULL; // Ресурс меню окон wc.cbClsExtra=0; // Дополнительная память wc.cbWndExtra=0; // Дополнительная память // Pегистрация класса окна. RegisterClass(&wc); // Создаем главное окно приложения. hWnd=CreateWindow( ClassName, // Имя класса окон AppTitle, // Заголовок окна WS_OVERLAPPEDWINDOW, // Стиль окна CW_USEDEFAULT, // X-координаты CW_USEDEFAULT, // Y-координаты CW_USEDEFAULT, // Ширина окна CW_USEDEFAULT, // Высота окна NULL, // Дескриптор окна-родителя NULL, // Дескриптор меню окна hInst, // Дескриптор экземпляра приложения NULL); // Дополнительная информация if(!hWnd) { // Окно не создано, выдаем предупреждение. MessageBox(NULL,"Create: error",AppTitle,MB_OK|MB_ICONSTOP); return FALSE; } if(!SUCCEEDED(MainRender.InitD3D(hWnd,pD3D,pDevice,d3dpp))) { return 0; } // Отображаем окно. ShowWindow(hWnd, nCmdShow); // Обновляем содержимое клиентской области окна. UpdateWindow(hWnd); MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { // Преобразование некоторых сообщений, полученных с помощью клавиатуры TranslateMessage(&msg); // Отправляем сообщение оконной процедуре DispatchMessage(&msg); } return msg.wParam; } // --- Функция окна LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { char *str="First Windows aplication"; switch(msg) { // Необходимо обновить содержимое клиентской области окна. case WM_PAINT: { Render(); }; break; // Нажата левая клавиша мыши в клиентской области окна. case WM_LBUTTONDOWN: { }; break; // Пользователь удалил окно. case WM_DESTROY: { // Если данная функция является оконной функцией главного окна, то // следует в очередь сообщений приложения послать сообщение WM_QUIT PostQuitMessage(0); MainRender.ReleaseD3D(pD3D,pDevice); }; break; // Необработанные сообщения передаем в стандартную // функцию обработки сообщений по умолчанию. default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0l; } |
|
| Автор: | GDX [ 25 сен 2005 21:18 ] |
| Заголовок сообщения: | |
Render.cpp #include"Render.h" bool DXRender::InitD3D(HWND hWnd,LPDIRECT3D9 pD3D,LPDIRECT3DDEVICE9 pDevice,D3DPRESENT_PARAMETERS d3dpp) { // Создание необходимой для устройства переменной. if((pD3D = Direct3DCreate9( D3D_SDK_VERSION ))==NULL) return E_FAIL; // Выход в случае неудачи. // Задание параметров для нашего устройства. // Обнуление большинства параметров. ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; // Устройство будет оконное. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Непосредственное создание устройства. if( FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice))) { // Если не удалось создать устройство, то выходим. return E_FAIL; } // Если устройство создалось нормально, то выходим. return S_OK; }; void DXRender::ReleaseD3D(LPDIRECT3D9 pD3D,LPDIRECT3DDEVICE9 pDevice) { if(pDevice) pDevice->Release(); if(pD3D) pD3D->Release(); }; |
|
| Автор: | GDX [ 25 сен 2005 21:19 ] |
| Заголовок сообщения: | |
Render.h #include <windows.h> #include"Include.h" class DXRender { public: bool InitD3D(HWND hWnd,LPDIRECT3D9 pD3D,LPDIRECT3DDEVICE9 pDevice,D3DPRESENT_PARAMETERS d3dpp); void ReleaseD3D(LPDIRECT3D9 pD3D,LPDIRECT3DDEVICE9 pDevice); }; |
|
| Автор: | GDX [ 25 сен 2005 21:21 ] |
| Заголовок сообщения: | |
Это моя попытка создать дирекс как класс, но при компляции появляется простое окно и ничего больше, не окрашывается в другой цвет ничего как бы инициализация и рендера дирекса ваше нет! |
|
| Автор: | MagicWolf [ 26 сен 2005 10:41 ] |
| Заголовок сообщения: | |
В отладчике смотрел - функция Render() вызывается? |
|
| Автор: | GDX [ 30 сен 2005 08:48 ] |
| Заголовок сообщения: | |
Вроде вызывается! Лучше киньте исходник где дирекс как класс сделанный! Если есть! |
|
| Автор: | MagicWolf [ 30 сен 2005 16:51 ] |
| Заголовок сообщения: | |
Вот такой движок тебя устроит? : irrlicht.sourceforge.net Инфо по нему: http://www.neogame.ru/articles/2/index.shtml |
|
| Автор: | GDX [ 05 окт 2005 17:19 ] |
| Заголовок сообщения: | |
А попроше исходник есть! |
|
| Автор: | MagicWolf [ 06 окт 2005 09:02 ] |
| Заголовок сообщения: | |
Проще не лучше. Например, вот это не пойдет тебе: http://www.codesampler.com/dx9src.htm Там хоть не класс, но в принципе тоже самое .... |
|
| Автор: | NetLib [ 06 окт 2005 14:10 ] |
| Заголовок сообщения: | |
да бросьте вы изобретать велосипед: в Книге Трухильо "Быстродействующая графика для Windows средствами DirectDraw" есть обвязка для DitrectX, то же самое в книгах "Программирование трехмерной графики с Direct3d", Секреты программирования трехмерной графики для Windows 95, да и практически в любой книге пишется оболочка для вызовов DX. |
|
| Автор: | GDX [ 06 окт 2005 21:24 ] |
| Заголовок сообщения: | |
да бросьте вы изобретать велосипед.Это всё правильно но хочется что самому изобрести что бы потом изобрести что то новое ! |
|
| Автор: | eNrix [ 06 янв 2006 11:22 ] |
| Заголовок сообщения: | |
Могу сказать в чем ошибка. Раз делать DirectX в классах то надобы само устройство тоже в Private: установить: class D3DDriver { public: InitD3D(); SetScreenParam(BOOL Default, BOOL Mode, DWORD Width, DWORD Height, UINT RefreshRate); SetFormatD3D(D3DFORMAT Format); InitDevice(); private: LPDIRECT3D9 pD3D; LPDIRECT3DDEVICE9; }; Мой способ класса DX9 все работает OK весь код есть в нете на моем сайте. Я писал письмо о вступлении в команду, если примите то с инициализацией проблем сильных не будет.
|
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|