Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Direct3D + DirectDraw, в полноэкранном режиме 
:(
    Опции темы
nns2009
Дата 25.7.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 1.2.2009

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



У меня в программе поначалу инициализируется DirectDraw, потом Direct3D.
Во время инициализации каждой части спрашивается: В полноэкранном режиме?
Если два раза нажать нет: всё норм.
Остальные варианты не работают, а при инициализации обоих частей в полноэкранном режиме: ошибка инициализации Direct3D.

Насколько я знаю в Direct3D есть поддержка 2D графики, какую из книг по Direct3D вы можете порекомендовать мне, желательно с обсуждением этой темы.

А пока, как запустить DirectDraw и Direct3D в полноэкранных режимах?

Инициализация DirectDraw
Код

HRESULT DXDDInit(IDirectDraw7 **ppiDD, IDirectDrawSurface7 **primsurf, IDirectDrawSurface7 **backsurf, HWND hWnd, 
                DWORD iWidth, DWORD iHeight, WORD iColors, BOOL *bFullScreen)
{   
    // Запрос на отображение в полноэкранном режиме
    int  iRes;
    if ((*bFullScreen)==FALSE)
        iRes=MessageBox(hWnd, "Use fullscreen mode?", "Screen", MB_YESNO | MB_ICONQUESTION);
    else
        iRes = IDYES;

    HRESULT hr; 
    hr = DirectDrawCreateEx(NULL, (VOID**)ppiDD, IID_IDirectDraw7, NULL);
    if(FAILED(hr))
        return 0;

    if(iRes == IDYES)
    {      
        //////////////////////////////////////////////////////////
        // Полноэкранный режим
        //////////////////////////////////////////////////////////
        *bFullScreen=TRUE;

        SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
        (*ppiDD)->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
        (*ppiDD)->SetDisplayMode(iWidth, iHeight, iColors, 0, 0);
    }
    else
    {
        //////////////////////////////////////////////////////////
        // Оконный режим
        ////////////////////////////////////////////////////////// 
        *bFullScreen=FALSE;

        RECT wndRect;
        RECT clientRect;
        GetWindowRect(hWnd, &wndRect);
        GetClientRect(hWnd, &clientRect);      
        int iWinWidth  = iWidth + (wndRect.right-wndRect.left)  - (clientRect.right-clientRect.left);
        int iWinHeight = iHeight + (wndRect.bottom-wndRect.top) - (clientRect.bottom-clientRect.top);
        
        MoveWindow(hWnd, wndRect.left, wndRect.top, iWinWidth, iWinHeight, TRUE);

        (*ppiDD)->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
    }

    DDSURFACEDESC2 desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.dwSize = sizeof(desc);

    if(iRes == IDYES)
    {      
       desc.dwFlags =  DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
       desc.dwBackBufferCount = 1;
       desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
    }
    else
    {
       desc.dwFlags =  DDSD_CAPS;
       desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    }

    hr=(*ppiDD)->CreateSurface(&desc, primsurf, 0);
    if (hr!=DD_OK)
        return 0;

    if(iRes == IDYES)
    {      
        DDSCAPS2 surfcaps;
        ZeroMemory(&surfcaps, sizeof(surfcaps));
        surfcaps.dwCaps = DDSCAPS_BACKBUFFER;
        hr=(*primsurf)->GetAttachedSurface(&surfcaps, backsurf);
        if (hr!=DD_OK)
            return 0;
        
        ClearSurface(*primsurf, 0);
        ClearSurface(*backsurf, 0);
    }
    else
    {
        ZeroMemory(&desc, sizeof(desc));
        desc.dwSize = sizeof(desc);
        desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
        desc.dwWidth = iWidth;
        desc.dwHeight = iHeight;
        desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
        
        // Создание поверхности
        HRESULT r=(*ppiDD)->CreateSurface(&desc, backsurf, 0);
        if (r!=DD_OK)        
            return 0; //Ошибка создания поверхности
    }


    return S_OK;
}


Инициализация 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_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;
}

PM MAIL   Вверх
BorisVorontsov
Дата 6.8.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Эм... Ты переходишь в эксклюзивный полноэкранный режим посредством DD, а потом хочешь сделать то же самое посредством D3D? Долго придумывал? (а код я узнаю, с одной книжечки)
Цитата(nns2009 @  25.7.2009,  13:23 Найти цитируемый пост)
Насколько я знаю в Direct3D есть поддержка 2D графики

Она всегда там была, просто сейчас с ней удобнее работать.


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
nns2009
Дата 10.8.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 1.2.2009

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



Цитата(BorisVorontsov @  6.8.2009,  14:13 Найти цитируемый пост)
Эм... Ты переходишь в эксклюзивный полноэкранный режим посредством DD, а потом хочешь сделать то же самое посредством D3D? Долго придумывал? (а код я узнаю, с одной книжечки)

Нет, просто в книге по DirectX автор не описал совместную работу Direct3D и DirectDraw.
Сейчас попробую убрать DDSCL_EXCLUSIVE из (*ppiDD)->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE |  DDSCL_FULLSCREEN);

А работа в Direct3D с 2D графикой описана не была.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




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


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

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