Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.1.2011
Репутация: нет Всего: нет
|
функция CreateSurface возвращает значение DD_OK но при этом указатель памяти поверхности равен NULL. как исправить положение? на всякий случай привожу код: | Код |
#ifndef POINTER_64 #define POINTER_64 __ptr64 #endif
#pragma comment(lib, "ddraw.lib") #pragma comment(lib, "dxguid.lib")
//Включаемые файлы
#define WIN32_LEAN_AND_MEAN //не MFC
#include<windows.h> #include<windowsx.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<DDRAW.h>
//Определения
#define WINDOW_CLASS_NAME "WINCLASS1"
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?0:1)
#define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define SCREEN_BPP 8
//Глобальные переменные
HINSTANCE hinstance_app; HWND main_window_handle; LPDIRECTDRAW7 lpdd = NULL; //версия 7.0 LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;//указатель на поверхность DDSURFACEDESC2 ddsd;// Описание поверхности LPDIRECTDRAWPALETTE lpddpal= NULL;// Интерфейс палитры PALETTEENTRY palette[256];//Хранилище палитры
//Прототипы функций
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM); int GameInit(); int GameMain(); int GameShutdown();
/*==========================================WinMain=============================================*/ int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdline, int nShowCmd) { WNDCLASSEX winclass;//Класс окна HWND hwnd;//Дескриптор окна MSG msg;//Cтруктура сообщения
//Определение класса
winclass.cbSize=sizeof(WNDCLASSEX); winclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW; winclass.lpfnWndProc=WindowProc; winclass.cbClsExtra=0; winclass.cbWndExtra=0; winclass.hInstance=hinstance; winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION); winclass.hCursor=LoadCursor(NULL, IDC_ARROW);//SetCursor() winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName=NULL; winclass.lpszClassName=(LPCWSTR)WINDOW_CLASS_NAME;
//сохранение hinstance
hinstance_app=hinstance;
//Регистрация класса
if(!RegisterClassEx(&winclass)) return(0);
//Создание окна
if(!(hwnd= CreateWindowEx(NULL, (LPCWSTR)WINDOW_CLASS_NAME, L"3d Game Console Version 1.0", WS_OVERLAPPEDWINDOW|WS_VISIBLE, 0,0,500,450, NULL,NULL, hinstance, NULL))) return(0); //сохранение дескриптора окна
main_window_handle=hwnd;
//инициализация игры
GameInit ();
//Главный цикл событий
while(TRUE) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //Проверка сообщения о выходе if(msg.message==WM_QUIT)break; TranslateMessage(&msg); DispatchMessage(&msg); }//if
//вывод очередного кадра игры
GameMain(); }//while
//Завершение игры
GameShutdown(); //Возврат в виндовс
return((int)msg.wParam);
}//WinMain /*==========================================WinMain=============================================*/ /*==========================================WindowProc=============================================*/ LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg, WPARAM wparam,LPARAM lparam) { //Главный обработчик сообщений в системе PAINTSTRUCT ps;//Используется в WM_PAINT HDC hdc;//Дескриптор контекста устройства //Какое сообщение получено switch(msg) { case WM_CREATE: { //Действия по инициализации return(0);//Успешное завершение } break; case WM_PAINT: { hdc=BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); return(0);//Успешное завершение }break; case WM_DESTROY: { //Завершение работы приложения PostQuitMessage(0); return(0);//Успешное завершение }break; default:break; }//switch //Обработка остальных сообщений return(DefWindowProc(hwnd, msg, wparam, lparam)); }//WindowProc /*==========================================WindowProc=============================================*/ /*==========================================GameInit=============================================*/ int GameInit () { // Эта функция вызывается один раз после создания окна // и перед входом в главный цикл обработки сообщений. Здесь // выполняются все инициализирующие действия. // Создаем базовый интерфейс IDirectDraw if (FAILED(DirectDrawCreateEx(NULL,(void **)&lpdd,IID_IDirectDraw7,NULL))) { //ошибка return (0); } // Задаем для уровня совместного доступа флаг DDSCL_NORMAL, // Работа в полноэкранном режиме if (FAILED(lpdd->SetCooperativeLevel(main_window_handle, DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX| DDSCL_EXCLUSIVE|DDSCL_ALLOWREBOOT))) { // Ошибка return (0); } //Установка видеорежима 640x480x8 if(FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT,SCREEN_BPP,0,0))) { // Ошибка return(0); }
// Успешное завершение, неудача или ваш код ошибки return(1); } // Game_Init /*==========================================GameInit=============================================*/ /*==========================================GameMain=============================================*/ int GameMain() { //Главный цикл игры, в котором выполняется вся е логика // Обнуление переменной ddsd и установка размера memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); //Задание полей ddsd.dwFlags= DDSD_CAPS; // Запрос первичной поверхности ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; // Создание первичной поверхности HRESULT csRes = lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL); switch(csRes) { case DD_OK: MessageBox(NULL, L"OK", L"DD", MB_OK); break; case DDERR_INVALIDOBJECT: MessageBox(NULL, L"INVALIDOBJECT", L"DD", MB_OK); break; case DDERR_INVALIDPARAMS: MessageBox(NULL, L"INVALIDPARAMS", L"DD", MB_OK); break; case DDERR_OUTOFVIDEOMEMORY: MessageBox(NULL, L"OUTOFVIDEOMEMORY", L"DD", MB_OK); break; case DDERR_NODIRECTDRAWHW: MessageBox(NULL, L"NODIRECTDRAWHW", L"DD", MB_OK); break; case DDERR_NOCOOPERATIVELEVELSET: MessageBox(NULL, L"NOCOOPERATIVELEVELSET", L"DD", MB_OK); break; case DDERR_INVALIDCAPS: MessageBox(NULL, L"INVALIDCAPS", L"DD", MB_OK); break; case DDERR_INVALIDPIXELFORMAT: MessageBox(NULL, L"INVALIDPIXELFORMAT", L"DD", MB_OK); break; case DDERR_NOALPHAHW: MessageBox(NULL, L"NOALPHAHW", L"DD", MB_OK); break; case DDERR_NOFLIPHW: MessageBox(NULL, L"NOFLIPHW", L"DD", MB_OK); break; case DDERR_NOZBUFFERHW: MessageBox(NULL, L"NOZBUFFERHW", L"DD", MB_OK); break; case DDERR_NOEXCLUSIVEMODE: MessageBox(NULL, L"NOEXCLUSIVEMODE", L"DD", MB_OK); break; case DDERR_OUTOFMEMORY: MessageBox(NULL, L"OUTOFMEMORY", L"DD", MB_OK); break; case DDERR_PRIMARYSURFACEALREADYEXISTS: MessageBox(NULL, L"PRIMARYSURFACEALREADYEXISTS", L"DD", MB_OK); break; case DDERR_NOEMULATION: MessageBox(NULL, L"NOEMULATION", L"DD", MB_OK); break; case DDERR_INCOMPATIBLEPRIMARY: MessageBox(NULL, L"INCOMPATIBLEPRIMARY", L"DD", MB_OK); break; default: MessageBox(NULL, L"Unknown error...", L"D3D", MB_OK); } // Создание массива для хранения данных палитры for(int color=1; color < 255; color++) { // Заполнение случайными значениями RGB palette[color].peRed = rand()%256; palette[color].peGreen = rand()%256; palette[color].peBlue=rand()%256; // Установка флага PC_NOCOLLAPSE palette[color].peFlags = PC_NOCOLLAPSE; } // for color // заполнение элементов О и 255 черным и белым цветами palette [0].peRed=0; palette[0].peGreen=0; palette[0].peBlue = 0; palette[0].peFlags = PC_NOCOLLAPSE; palette[255].peRed=255; palette[255].peGreen = 255; palette[255].peBlue=255; palette[255].peFlags = PC_NOCOLLAPSE; // Создание объекта-палитры if(FAILED(lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE,palette,&lpddpal,NULL))) { MessageBox(NULL, L"OK", L"D3D", MB_OK); } // Присоединение палитры к первичной поверхности HRESULT spRes = lpddsprimary->SetPalette(lpddpal); switch(spRes) { case DDERR_INVALIDOBJECT: MessageBox(NULL, L"INVALIDOBJECT", L"DD", MB_OK); break; case DDERR_NOEXCLUSIVEMODE: MessageBox(NULL, L"NOEXCLUSIVEMODE", L"DD", MB_OK); break; case DDERR_NOT8BITCOLOR: MessageBox(NULL, L"NOT8BITCOLOR", L"DD", MB_OK); break; case DDERR_UNSUPPORTED: MessageBox(NULL, L"UNSUPPORTED", L"DD", MB_OK); break; case DDERR_GENERIC: MessageBox(NULL, L"GENERIC", L"DD", MB_OK); break; case DDERR_INVALIDPARAMS: MessageBox(NULL, L"INVALIDPARAMS", L"DD", MB_OK); break; case DDERR_NOPALETTEATTACHED: MessageBox(NULL, L"NOPALETTEATTACHED", L"DD", MB_OK); break; case DDERR_SURFACELOST: MessageBox(NULL, L"SURFACELOST", L"DD", MB_OK); break; case DDERR_NOPALETTEHW: MessageBox(NULL, L"NOPALETTEHW", L"DD", MB_OK); break; default: MessageBox(NULL, L"Unknown error...", L"D3D", MB_OK); } // Блокируем поверхность и запрашиваем указатель и шаг памяти // Обнуление переменной ddsd и установка размера memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); // Теперь поля ddsd.LPitch и ddsd.LpSurface достоверны // Введение некоторых дополнительных переменных, чтобы код был // более понятным и не требовалось преобразование типов int mempitch = ddsd.lPitch; UCHAR *video_buffer =(UCHAR *) ddsd.lpSurface; // Вывод на первичную поверхность 1000 пикселей со случайными // координатами и цветами; они тут же отображаются на экране for (int index=0; index < 1000; index++) { // Выбор случайного положения и цвета для режима 640x480x8 UCHAR color = rand()%256; int x = rand()%640; int y = rand()%480; // Вывод пикселя video_buffer[x+y*mempitch] = color; }//for index // Снятие блокировки с первичной поверхности if(FAILED(lpddsprimary->Unlock(NULL))) { // } //Проверка выхода из игры if(KEYDOWN(VK_ESCAPE)) SendMessage(main_window_handle,WM_CLOSE,0,0);
//Успешное завершение или собственный код ошибки
return(1);
}//GameMain /*==========================================GameMain=============================================*/ /*==========================================GameShutdown=============================================*/ int GameShutdown () { // Эта функция вызывается при завершении работы игры. // В ней выполняются все действия по освобождению // захваченных ресурсов и т.п. //Сначала палитра if (lpddpal) { lpddpal->Release(); lpddpal=NULL; } // Затем первичная поверхность if (lpddsprimary) { lpddsprimary->Release(); lpddsprimary=NULL; } // Освобождаем интерфейс IDirectDraw if (lpdd) { lpdd->Release(); lpdd = NULL; } // Успешное завершение, неудача или ваш код ошибки
return(1); } // Game_Shutdown /*==========================================GameShutdown=============================================*/
|
|