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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает прога из книги в гугле не нашёл 
:(
    Опции темы
alex6077582
Дата 16.9.2010, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите разобраться
Занимаюсь по книге Горнакова, там много ошибок, я их исправил, но проблема осталась
Код:
Код

#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL;
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw;
    DWORD color;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

HRESULT InitialDirect3D(HWND hwnd)
{
    if(NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
    D3DDISPLAYMODE Display;
    if(FAILED(pDirect3D->GetAdapterDisplayMode(
        D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;
    D3DPRESENT_PARAMETERS Direct3DParametr;
    ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));
    Direct3DParametr.Windowed = TRUE;
    Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
    //Direct3DParametr.BackBufferCount = 1;
    //Direct3DParametr.BackBufferHeight = 900;
    //Direct3DParametr.BackBufferWidth = 1440;
    Direct3DParametr.BackBufferFormat = Display.Format;
    //Direct3DParametr.AutoDepthStencilFormat = D3DFMT_D16;

    if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
    return S_OK;
}

HRESULT InitialBufferVershin()
{
    CUSTOMVERTEX Vershin[] =
    {
        {300.0f, 300.0f, 0.5f, 1.0f, 0x00000fff, },
        {150.0f, 300.0f, 0.5f, 1.0f, 0x00000fff, },
        {150.0f, 150.0f, 0.5f, 1.0f, 0x00000fff, },
    };

    if(FAILED(pDirect3DDevice->CreateVertexBuffer(
        3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
        D3DPOOL_DEFAULT, &pBufferVershin, NULL)))
        return E_FAIL;
    VOID* pBV;
    if(FAILED(pBufferVershin->Lock(0, sizeof(Vershin),
        (void**)&pBV, 0)))
        return E_FAIL;
    memcpy(pBV, Vershin, sizeof(Vershin));
    pBufferVershin->Unlock();
    return S_OK;
}


VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)
        return;
    pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
        D3DCOLOR_XRGB(0, 255, 0), 1.0f, NULL);
    pDirect3DDevice->BeginScene();
    pDirect3DDevice->SetStreamSource(0, pBufferVershin, 0,
        sizeof(CUSTOMVERTEX));
    pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    pDirect3DDevice->EndScene();
    pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
    
}

VOID DeleteDirect3D()
{
    if(pBufferVershin != NULL)
        pBufferVershin->Release();
    if(pDirect3DDevice != NULL)
        pDirect3DDevice->Release();
    if(pDirect3D != NULL)
        pDirect3D->Release();
}


LRESULT CALLBACK MainWinProc(HWND hwnd, 
              UINT msg, 
              WPARAM wparam, 
              LPARAM lparam) 

  switch(msg) 
  { 
  //case WM_PAINT:
    //  RenderingDirect3D();
      //ValidateRect(hwnd, NULL);
      //break; 
    case WM_DESTROY: 
    { 
          DeleteDirect3D();
          PostQuitMessage(0); 
          return(0); 
    }    // break; 
  } 
  return (DefWindowProc(hwnd, msg, wparam, lparam)); 
}

int WINAPI WinMain (HINSTANCE hinstance,HINSTANCE hprevinstanse ,LPSTR LpCmdLine,int nCmdShow)
{
    WNDCLASSEX windowsclass;
    HWND hwnd; // класс HWND для создания окна
    MSG msg;
    windowsclass.cbSize = sizeof(WNDCLASSEX);//размер создаваемой структуры
    windowsclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW|CS_VREDRAW; // флаги стиля окна
    windowsclass.lpfnWndProc = MainWinProc;  //указатель на функцию обратного вызова
    windowsclass.cbClsExtra = 0; // для хранения дополнительной информации
    windowsclass.cbWndExtra = 0; // для хранения дополнительной информации
    windowsclass.hInstance = hinstance; //отвечает зп экземляр созлдаваемого приложения
    windowsclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //для определения пиктограмы приложения
    windowsclass.hCursor = LoadCursor(NULL,IDC_ARROW); //для определения курсора приложения
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); // отвечает за цвет окна
    windowsclass.lpszMenuName = NULL; //поле для подключения стандартного меня к окну
    windowsclass.lpszClassName = TEXT("WINDOWSCLASS"); //задаеться ваше названеи класса окна 
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);//дескриптор малой пиктограммы , которая выводиться на панель задач 

    if(!RegisterClassEx(&windowsclass)) 
        return(0); 

    if(!(hwnd = CreateWindowEx(NULL, 
        TEXT("WINDOWSCLASS"), TEXT("Базовое окно для DirectX"), 
    WS_OVERLAPPEDWINDOW|WS_VISIBLE, 
    300, 150, 500, 400, NULL, NULL, hinstance, NULL ))) 
        return(0);

    if(SUCCEEDED(InitialDirect3D(hwnd)))
    {
        if(SUCCEEDED(InitialBufferVershin()))
        {
            ShowWindow(hwnd, SW_SHOWDEFAULT); //нарисуем окно 
            UpdateWindow(hwnd); 
            ZeroMemory(&msg, sizeof(msg));

            while(msg.message != WM_QUIT) 
            { 
                if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
                else
                    RenderingDirect3D();

            } 
        
        }
    }
    return(0);
}


Вобщем по идее должно быть жолтое окно и синий треугольник, а у меня ничего не происходит, просто серое окно и всё, пожалуйста подскажите, что я делаю не так.



M
Alexeis
используйте кнопочку код


PM MAIL   Вверх
Alexeis
Дата 16.9.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



  Все функции срабатывают? (возвращают успех)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
alex6077582
Дата 16.9.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да всё работает.
Это полный код программы, его можно в пустой проект скопировать.
Но проблема в том, в книге написано, что на экране(в окне) будет синий треугольник.
У меня Windows 7, visual studio 2008, dx10, а книга старая и я думаю, что мне пару какихто строк не хватает.
Похожая проблема у меня была с MFC, большая часть литературы устаревшая, и я только с 3й книги понял, что и где в примере подправить чтобы оно работало, сейчас изучаю MFC без проблем. 
Но с Dirctx сложнее, сам не разберусь надо, чтоб кто-то подсказал.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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