Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция SetPalette возвращает SURFACELOST 
:(
    Опции темы
Inacondition
Дата 26.1.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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=============================================*/



PM MAIL   Вверх
EgoBrain
Дата 16.2.2011, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: 1
Всего: 2



А где видно из кода что lpddsprimary == NULL?
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.