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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка с подключением хэдера 
:(
    Опции темы
Nikitozz
Дата 12.6.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2007
Где: Москва

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



Такая проблема. Установил DirectX 9 учусь рисовать. рисовал просто треугольник все работает

потключал <d3d9.h> нормально работает
решил нарисовать трехмерную мадель с использованием матриц
подключаю <d3dx9.h> - пишет нет такого файла, хотя все там есть смотрел
библеотеки подключил d3d9.lib и d3dx9.lib

не могу понять в чем проблема, может поможете?
PM MAIL WWW   Вверх
Graf_h
Дата 12.6.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Можно посмотреть ошибки?



--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Nikitozz
Дата 12.6.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2007
Где: Москва

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



Вот весь код:

Код

#include <windows.h>
#include <winuser.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <mmsystem.h>

LPDIRECT3D9 pDirect3D = NULL;                    //Главный объект
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;        //Устройство
LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL;    //Буфер вершин

struct CUSTOMVERTEX
{
    FLOAT x, y, z;            //Координаты
    DWORD color;            //Цвет вершин
};

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ| D3DFVF_DIFFUSE )

//---------
//Функция инициализации Direct3D
//---------
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.BackBufferFormat = Display.Format;

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

    //отключить отсечение Direct3D
    pDirect3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    //отключить освещение
    pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);
}
//---------

//---------
//Инициализация вершин
//---------
HRESULT InitialBufferVershin()
{
    CUSTOMVERTEX Vershin[] =
    {
        {1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(197, 113, 215), },    //A
        {-1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(23, 171, 12), },        //B
        {-1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 55, 55), },        //C

        {-1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 55, 55), },        //C
        {1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(28, 22, 245), },        //D
        {1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(197, 113, 215), },    //A
    };

    if(FAILED(pDirect3DDevice -> CreateVertexBuffer(6*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;
}
//---------

//---------
//Функция Matrix
//---------
VOID Matrix()
{
    D3DMATRIX MatrixWorld;            //Мировая матрица
    D3DMATRIX MatrixView;            //Матрица вида
    D3DMATRIX MatrixProjection ;    //Матрица проекции

    //MatrixWorld
    UINT Time = timeGetTime() % 5000;
    FLOAT Angle = Time * (2.0f * D3DX_PI) / 5000.0f;
    D3DMatrixRotationY(&MatrixWorld, Angle);
    pDirect3DDevice -> SetTransform(D3DTS_WORLD, &MatrixWorld);

    //MatrixView
    D3DXMatrixLookAtLH(&MatrixView, &D3DXVECTOR3(0.0f, 0.0f, -8.0f),
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    pDirect3DDevice ->SetTransform(D3DTS_VIEW, &MatrixView);

    //MatrixProjection
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
    pDirect3DDevice ->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
//---------

VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)            //Проверяем ошибки
        return;
    pDirect3DDevice -> Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 0), 1.0f, 0);
    pDirect3DDevice -> BeginScene();    //Начало сцены
    //Здесь происходит прорисовка сцены
    pDirect3DDevice -> SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX));
    pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);
    pDirect3DDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
    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_DESTROY:
        {
            DeleteDirect3D();
            PostQuitMessage(0);
            return(0);
        }
    }

    return (DefWindowProc(hwnd, msg, wparam, lparam));
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowsclass;
    HWND hwnd;
    MSG msg;

    windowsclass.cbSize = sizeof(windowsclass);
    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 = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

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

    if(!(hwnd = CreateWindowEx(NULL,
        "WINDOWSCLASS",
        "Рисуем треугольник",
        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;
}


Compiling...
MatrixKvadrat.cpp
c:\visual studio 2008\projects\urok6\urok6\matrixkvadrat.cpp(3) : fatal error C1083: Cannot open include file: 'd3dx9.h': No such file or directory
Build log was saved at "file://c:\Visual Studio 2008\Projects\Urok6\Urok6\Debug\BuildLog.htm"
Urok6 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Это сообщение отредактировал(а) Nikitozz - 12.6.2008, 11:23
PM MAIL WWW   Вверх
konekt
Дата 12.6.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А ты в настройках VC++2008 указывал директории подключаемых файлов? 
Путь к d3dx9.h.
PM MAIL   Вверх
Nikitozz
Дата 12.6.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2007
Где: Москва

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



Цитата(konekt @  12.6.2008,  12:48 Найти цитируемый пост)
 ты в настройках VC++2008 указывал директории подключаемых файлов? 
Путь к d3dx9.h



Этого я не делал, а где можно указать путь?
PM MAIL WWW   Вверх
konekt
Дата 12.6.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Tools|Options|Projects and Solution|VC++ Directories далее В окне Show Directories for выбираешь Include files затем на кнопку New Line и указываешь путь к директории DirectX-Include (где у тебя должен быть зарыт D3DX9.H)
Затем в Show Directories for выбираешь Lib files затем New Line  и указываешь путь к DirectX-Lib файлам.
Вообщем, указываешь VC++ Куда ты поставил DirectX SDK.
Кстати, я запустил твой фаил, правда, пришлось исправить пару ошибок (забыл поставить } и не правильно указал имя функции Direct API. Но кроме пустого черного окна ничего не увидел. Если разберешься в чем тут дело - напиши.
PM MAIL   Вверх
Graf_h
Дата 12.6.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Цитата(Nikitozz @  12.6.2008,  13:54 Найти цитируемый пост)
Этого я не делал, а где можно указать путь

Можеш просто указать в include:
Код

#include "path/d3d9."


Где вместо path пишеш тот путь, где лежать твои хедеры


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
konekt
Дата 12.6.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Можеш просто указать в include:
Выделить всёкод C++
1:
    
#include "path/d3d9."


Где вместо path пишеш тот путь, где лежать твои хедеры



Так конечно тоже можно. Но всеже, почему кроме пустого черного окна ничего нет. Вроде должен быть цветной примитивчик. 
PM MAIL   Вверх
Nikitozz
Дата 12.6.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2007
Где: Москва

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



Попробовал через Options подключить, выдает кучу ошибок, указал путь - работает. Исправил другие ошибки... Компилит нормально, теперь при линковке ошибка:

------ Build started: Project: Urok6, Configuration: Debug Win32 ------
Linking...
MatrixKvadrat.obj : error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "void __cdecl Matrix(void)" (?Matrix@@YAXXZ)
C:\Visual Studio 2008\Projects\Urok6\Debug\Urok6.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://c:\Visual Studio 2008\Projects\Urok6\Urok6\Debug\BuildLog.htm"
Urok6 - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Должен получится квадрат с разноцветными вершинами, вращающийся по оси Y

Это сообщение отредактировал(а) Nikitozz - 12.6.2008, 16:51
PM MAIL WWW   Вверх
konekt
Дата 12.6.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробуй подключить winmm.lib У меня все линкуется, только, опять повтоюсь, ничего не выводится на экран. Я даже из тутора по директу запускаю пример - должен быть цветной треугольник, а у меня белый. Бьюсь над этой проблемой уже 4 часа. Ты писал, что запускал прогу с треугольником. У тебя он цветной получился?
PM MAIL   Вверх
Nikitozz
Дата 12.6.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2007
Где: Москва

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



без матрици когда делал, просто прорисовал все получалось, желтый фон и цветной квадрат был. сейчас у меня просто черное окно появляется. буду искать ошибку

Спасибо за подсказку насчет либа

Добавлено через 13 минут и 49 секунд
Нашел первую ошибку в функции InitialDirect3D()

return S_OK; надо в самый конец поставить, получится вот так

Код

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.BackBufferFormat = Display.Format;

    if(FAILED(pDirect3D ->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
    //отключить отсечение Direct3D
    pDirect3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    //отключить освещение
    pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);
    return S_OK;
}


Добавлено через 14 минут и 59 секунд
только теперь этот квадрат растянут на все окно... буду искать дальше

Это сообщение отредактировал(а) Nikitozz - 12.6.2008, 22:46
PM MAIL WWW   Вверх
konekt
Дата 13.6.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за найденную ошибку. Вижу цветастое окно. Возможно проблема в инициализации матрицы вида либо word. Есть другой пример в котором куб вращается очень хорошо (из тутора по Direct) есть еще один из учебника, но там кубик ооооочень маленький  и если не знаешь что это куб и что он должен вращаться, то не догадаешься. Правда отрисовка происходит в сообщении WM_PAINT. Так вод там, если химичить с камерами, то можно чтото рассмотреть. 
А так в Direct я застрял именно на этом и не могу дальше сдвинуться.
PM MAIL   Вверх
konekt
Дата 13.6.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все работает!!! Ошибку  нашел. В функции VOID RenderingDirect3D() не указан вызов функции Matrix().

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2007
Где: Москва

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



Точно блин!!!  smile  все работает  smile 

теперь буду куб пробовать сделать smile

Это сообщение отредактировал(а) Nikitozz - 13.6.2008, 16:28
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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