Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Вывод Text


Автор: Stas96 22.12.2009, 19:22
Всем доброго времени суток!Выводя текст  в DirectX
Вот код:
Код

//-----------------------------------------------------------------------------------
// Text.CPP 
// Текст в Direct3D
//-----------------------------------------------------------------------------------
#include <windows.h>         // Подключаем заголовочный файл Windows
#include <d3d9.h>            // Подключаем заголовочный файл DirectX 9 SDK
#include <d3dx9.h>           // Подключаем из D3DX утилит для работы с матрицами
#include <mmsystem.h>        // Подключаем системную библеотеку 
#include <d3dx9core.h>       // Подключаем системный заголовочный файл
//-----------------------------------------------------------------------------------
// Глобальные переменные
//-----------------------------------------------------------------------------------
LPDIRECT3D9                 pDirect3D          = NULL;      // Главный Direct3D обьект
LPDIRECT3DDEVICE9           pDirect3DDevice    = NULL;      // Устройство 
LPDIRECT3DVERTEXBUFFER9     pBufferVershin     = NULL;      // Буфер вершин
LPDIRECT3DINDEXBUFFER9      pBufferIndex       = NULL;      // Индексный буфер 
LPD3DXFONT                  pFont              = NULL;      // Шрифт Direct3D
RECT Rec;       // Прямоугольник
HFONT hFont;    // Шрифт
struct CUSTOMVERTEX
{
    FLOAT x,  y,  z;      //кординаты 
    FLOAT nx, ny, nz;     //нормали
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)  // Формат вершин
//-----------------------------------------------------------------------------------
// Функция
// InitialDirect3D()
// Инициализация 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         = FALSE;
    Direct3DParametr.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat = Display.Format;
    Direct3DParametr.EnableAutoDepthStencil = TRUE;
    Direct3DParametr.AutoDepthStencilFormat = D3DFMT_D16;
    Direct3DParametr.BackBufferWidth  = GetSystemMetrics(SM_CXSCREEN);;
    Direct3DParametr.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);
    Direct3DParametr.BackBufferCount = 3;
    Direct3DParametr.FullScreen_RefreshRateInHz = Display.RefreshRate;
    if( FAILED( pDirect3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                      &Direct3DParametr, &pDirect3DDevice ) ) )
        return E_FAIL;
    
    // Включаем отсеченние Direct3D
    pDirect3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
    // Подключаем Z буфер
    pDirect3DDevice->SetRenderState (D3DRS_ZENABLE, D3DZB_TRUE); 
   return S_OK;
}
//---------------------------------------------------------------------------------------
// Функция
// InitialObject()
// Иннициализирует вершины
//---------------------------------------------------------------------------------------
HRESULT InitialObject()
{
   CUSTOMVERTEX Vershin[] =
    {
      
       {  1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, }, //А
       {  1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, }, //В
       { -1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, }, //С
       { -1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, }, //D
        
       { -1.0f,-1.0f,-1.0f,-1.0f, 0.0f, 0.0f, }, //A2
       { -1.0f, 1.0f,-1.0f,-1.0f, 0.0f, 0.0f, }, //B2
       { -1.0f, 1.0f, 1.0f,-1.0f, 0.0f, 0.0f, }, //C2
       { -1.0f,-1.0f, 1.0f,-1.0f, 0.0f, 0.0f, }, //D2
    
       { -1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, }, //A3
       { -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, }, //B3
       {  1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, }, //C3
       {  1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, }, //D3
        
       {  1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, }, //A4
       {  1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, }, //B4
       {  1.0f, 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, }, //C4
       {  1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 0.0f, }, //D4
        
       {  1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, }, //A5
       { -1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, }, //B5
       { -1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, }, //C5
       {  1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, }, //D5
       
       {  1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, }, //A6 
       { -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, }, //B6
       { -1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, }, //C6
       {  1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, }, //D6
        
    };
    const unsigned short Index[]={
    0,1,2,      2,3,0,
    4,5,6,      6,7,4,
    8,9,10,     10,11,8,
    12,13,14,   14,15,12,
    16,17,18,   18,19,16,
    20,21,22,   22,23,20,
    };
    // Создаем буфер вершин
    if( FAILED( pDirect3DDevice->CreateVertexBuffer( 36 * 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(); 
    // Создаем индексный буфер
    pDirect3DDevice->CreateIndexBuffer( 36 * sizeof(Index), 
       0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&pBufferIndex, NULL);
    //Блокируем
    VOID* pBI;
    pBufferIndex->Lock( 0, sizeof(Index) , (void**)&pBI, 0 );
    //Копируем
    memcpy( pBI, Index, sizeof(Index) );
    // Разблокируем
    pBufferIndex->Unlock();
  return S_OK;
}
//-----------------------------------------------------------------------------
// Функция
// Matrix()
// Мировая матрица, матрица вида, матрица проекции
//-----------------------------------------------------------------------------
VOID Matrix()
{
    D3DXMATRIX MatrixWorld, MatrixWorldX, MatrixWorldY;      //  Мировая матрица (MatrixWorld)
    D3DXMATRIX MatrixView;       //  Матрица вида (MatrixView)
    D3DXMATRIX MatrixProjection; //  Матрица проекции (MatrixProjection)
    // MatrixWorld
    UINT  Time  = timeGetTime() % 5000;
    FLOAT Angel = Time * (2.0f * D3DX_PI) / 5000.0f;
    D3DXMatrixRotationX( &MatrixWorldX,  Angel );
    D3DXMatrixRotationY( &MatrixWorldY,  Angel );
    D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY );
    pDirect3DDevice->SetTransform( D3DTS_WORLD,&MatrixWorld );
    // MatrixView
    D3DXMatrixLookAtLH( &MatrixView,  &D3DXVECTOR3 ( 0.0f, 0.0f,-11.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 );
}
//----------------------------------------------------------------------------------
//  Функция
//  LightMaterial()
//  Инициализируем Свет и Материал
//-----------------------------------------------------------------------------------
VOID LightMaterial()
{
    D3DMATERIAL9  Material; // Материал
    D3DLIGHT9     Light;    // Свет

    //  Установим материал
    ZeroMemory( &Material, sizeof(D3DMATERIAL9) );
    Material.Diffuse.r = Material.Ambient.r = 1.0f;
    Material.Diffuse.g = Material.Ambient.g = 1.0f;
    Material.Diffuse.b = Material.Ambient.b = 0.0f;
    Material.Diffuse.a = Material.Ambient.a = 1.0f;
    pDirect3DDevice->SetMaterial( &Material );

    D3DXVECTOR3 VectorDir;
    //  Установим свет
    ZeroMemory( &Light, sizeof(D3DLIGHT9) );
    Light.Type       = D3DLIGHT_DIRECTIONAL;
    Light.Diffuse.r  = 1.0f;
    Light.Diffuse.g  = 1.0f;
    Light.Diffuse.b  = 1.0f;
    Light.Range      = 1000.0f;
    //  Установим нормаль
    VectorDir = D3DXVECTOR3(0.0f, 0.0f,1.0f),
    D3DXVec3Normalize( (D3DXVECTOR3*)&Light.Direction, &VectorDir );

    pDirect3DDevice->SetLight( 0, &Light );
    pDirect3DDevice->LightEnable( 0, TRUE );

    pDirect3DDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
    pDirect3DDevice->SetRenderState( D3DRS_AMBIENT, 0 );
}
//--------------------------------------------------------------------------------------
//  Функция
//  DrawMyText()
//  Выводит текст на экран
//--------------------------------------------------------------------------------------
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
        char* StrokaTexta,int x,int y,int x1,int y1,D3DCOLOR MyColor)
{
    // Создаем шрифт
    hFont = CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,            
                        0,0,DEFAULT_PITCH|FF_MODERN,L"Arial");    
    // Координаты прямоугольника
    Rec.left = x;                            
    Rec.top  = y;
    Rec.right  = x1;
    Rec.bottom = y1;
    // Инициализируем шрифт
    ID3DXCreateFont(pDirect3DDevice, hFont, &pFont);    
    // Начало
    pFont->Begin();    
    // Вывод текста
    pFont->DrawText(StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
    // Конец
    pFont->End();                                    
}
//-----------------------------------------------------------------------------------
//  Функция
//  RenderingDirect3D()
//  Рисуем
//-----------------------------------------------------------------------------------

VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)        // Проверяем ошибки
        return;
    
    pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER,
                              D3DCOLOR_XRGB(60,100,150), 1.0f, 0 );
    // Начало сцены
    pDirect3DDevice->BeginScene();     
    
    // Здесь происходит прорисовка сцены
    LightMaterial();
    Matrix();
 
    pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) );
    pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    pDirect3DDevice->SetIndices(pBufferIndex);

    // Вывод объекта
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    // Вывод текста
    DrawMyText(pDirect3DDevice,hFont,"Урок 9\nТекст в Direct3D\nДля выхода нажмите клавишу <Esc> ",
                       10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));              
     // Конец сцены
    pDirect3DDevice->EndScene();       
    //  Представляем на экран 
    pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------------
//  Функция
//  DeleteDirect3D()
//  Освобождает захваченные ресурсы
//-----------------------------------------------------------------------------------
VOID DeleteDirect3D()
{

     if( pFont  != NULL)
        pFont->Release(); 

     if( pBufferIndex  != NULL)
        pBufferIndex->Release(); 

    if( pBufferVershin  != NULL)
        pBufferVershin->Release(); 

    if( pDirect3DDevice != NULL) 
        pDirect3DDevice->Release();

    if( pDirect3D != NULL)
        pDirect3D->Release();
}
//-----------------------------------------------------------------------------------
// Функция
// MainWinProc()
// Здесь происходит обработка сообщений
//-----------------------------------------------------------------------------------

LRESULT CALLBACK MainWinProc(HWND   hwnd,            
                            UINT    msg,              
                            WPARAM  wparam,           
                            LPARAM  lparam)          
{
switch(msg)
    {    
    
     case WM_DESTROY: 
        {
        DeleteDirect3D();
        PostQuitMessage(0);
        return(0);
        }
     case WM_KEYDOWN: 
        {
        if(wparam==VK_ESCAPE)
        PostQuitMessage(0);
        return 0;
        }
    } 
  return DefWindowProc(hwnd, msg, wparam, lparam);
} 
//-----------------------------------------------------------------------------------
// Функция
// WinMain
// Входная точка приложения
//-----------------------------------------------------------------------------------

int WINAPI WinMain(    HINSTANCE hinstance,
                    HINSTANCE hprevinstance,
                    LPSTR lpcmdline,
                    int ncmdshow)
{
WNDCLASSEX windowsclass;  // Создаем класс
HWND       hwnd;          // Создаем дескриптор окна
MSG        msg;           // Идентификатор сообщения

// Определим класс окна WNDCLASSEX
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    = L"WINDOWSCLASS";
windowsclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

// Зарегистрируем класс
if (!RegisterClassEx(&windowsclass))
    return(0);

// Теперь когда класс зарегестрирован можно создать окно

if (!(hwnd = CreateWindowEx(NULL,              // стиль окна
                       L"WINDOWSCLASS",         // класс
                       L" Текст в Direct3D ",                // название окна
                       WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                       0,0,                   // левый верхний угол
                       GetSystemMetrics(SM_CXSCREEN),// ширина
                       GetSystemMetrics(SM_CYSCREEN),// высота
                       NULL,                   // дескриптор родительского окна 
                       NULL,                   // дескриптор меню
                       hinstance,              // дескриптор экземпляра приложения
                       NULL)))                   // указатель на данные окна                                            
return 0;

 if( SUCCEEDED( InitialDirect3D( hwnd ) ) )
  { 
     if( SUCCEEDED( InitialObject( ) ) )
       {
           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;
}

Возникла проблема выдает ошибку:
"1>e:\c++\программы\directx\directx\lesson 9.cpp(214) : error C3861: ID3DXCreateFont: идентификатор не найден
1>e:\c++\программы\directx\directx\lesson 9.cpp(216) : error C2039: Begin: не является членом "ID3DXFont"
1>        c:\program files (x86)\microsoft directx sdk (august 2009)\include\d3dx9core.h(314): см. объявление 'ID3DXFont'
1>e:\c++\программы\directx\directx\lesson 9.cpp(218) : error C2660: ID3DXFont::DrawTextW: функция не принимает 5 аргументов
1>e:\c++\программы\directx\directx\lesson 9.cpp(220) : error C2039: End: не является членом "ID3DXFont"
1>        c:\program files (x86)\microsoft directx sdk (august 2009)\include\d3dx9core.h(314): см. объявление 'ID3DXFont' "

  Прошу объяснить мне в чем проблема. smile   Заранее благодарен!!! smile 

Автор: Sfate 22.12.2009, 20:32
вместо ID3DXCreateFont надо D3DXCreateFont
"Begin: не является членом "ID3DXFont"" естественно не является)) вызов прорисовки текста должен производиться между pDirect3DDevice->BeginScene() и pDirect3DDevice->EndScene()... тоже самое и про end...
"DrawTextW" smile такой функции у тебя в коде не видно... ток DrawText...
пример, на скорую руку)
Код

    pDirect3DDevice->BeginScene();
//текст/*начало
    HFONT hFont;
    LPD3DXFONT pFont = NULL;
    RECT Rec;
    int x1=10;
    int y1=10;
    int x2=500;
    int y2=700;
    D3DCOLOR MyColor=D3DCOLOR_ARGB(250,250,250,50);
    // Создаем шрифт
    D3DXCreateFont(pDevice,30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,L"Arial",&pFont);    
    // Координаты прямоугольника
    Rec.left = x1;                            
    Rec.top  = y1;
    Rec.right  = x2;
    Rec.bottom = y2;

    pFont->DrawText(NULL,L"Лаб. раб. №3\nВращение куба\nДля выхода нажмите клавишу <Esc> ", -1, &Rec, DT_WORDBREAK, MyColor);
    // удаляем
    pFont->Release();
//текст*/конец
    
    render_scene( pDevice );

    pDirect3DDevice->EndScene();

Автор: Stas96 22.12.2009, 22:22
ААА...Спасибо большое. smile  smile  smile  smile Наверное в  книге автор с примером напортачил smile 

Автор: Sfate 22.12.2009, 22:33
Цитата(Stas96 @  22.12.2009,  22:22 Найти цитируемый пост)
Наверное в  книге автор с примером напортачил 
да... бывают случаи smile 


Цитата(Stas96 @  22.12.2009,  22:22 Найти цитируемый пост)
ААА...Спасибо большое
пжл smile сам просто недавно с текстом разобрался smile 

Автор: Stas96 22.12.2009, 22:50
Слушай уже другие проблемы(
Вот ошибки:  ">e:\c++\программы\directx\directx\lesson 9.cpp(215) : error C2660: D3DXCreateFontW: функция не принимает 11 аргументов
1>e:\c++\программы\directx\directx\lesson 9.cpp(222) : error C2660: D3DXCreateFontW: функция не принимает 3 аргументов
1>e:\c++\программы\directx\directx\lesson 9.cpp(226) : error C2660: ID3DXFont::DrawTextW: функция не принимает 5 аргументов "
А вот код:
Код

//--------------------------------------------------------------------------------------
//  Функция
//  DrawMyText()
//  Выводит текст на экран
//--------------------------------------------------------------------------------------
VOID DrawText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
char* StrokaTexta)

{

    int x = 10;
    int y = 20; 
    int x1 = 500;  
    int y1 = 700; 
    D3DCOLOR MyColor = D3DCOLOR_ARGB(250,250,250,50);
    // Создаем шрифт
    D3DXCreateFont(30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,L"Arial",&pFont);   
    // Координаты прямоугольника
    Rec.left = x;                            
    Rec.top  = y;
    Rec.right  = x1;
    Rec.bottom = y1;
    // Инициализируем шрифт
    D3DXCreateFont(pDirect3DDevice, hFont, &pFont);    
    // Начало
    pDirect3DDevice->BeginScene();
    // Вывод текста
    pFont->DrawText(StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
    // Конец
    pDirect3DDevice->EndScene();                                
}
//-----------------------------------------------------------------------------------
//  Функция
//  RenderingDirect3D()
//  Рисуем
//-----------------------------------------------------------------------------------

VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)        // Проверяем ошибки
        return;
    
    pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER,
                              D3DCOLOR_XRGB(60,100,150), 1.0f, 0 );
    // Начало сцены
    pDirect3DDevice->BeginScene();     
    
    // Здесь происходит прорисовка сцены
    LightMaterial();
    Matrix();
 
    pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) );
    pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    pDirect3DDevice->SetIndices(pBufferIndex);

    // Вывод объекта
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    // Вывод текста
     pFont->DrawText(NULL,L"Лаб. раб. №3\nВращение куба\nДля выхода нажмите клавишу <Esc> ", -1, &Rec, DT_WORDBREAK, MyColor);

     // Конец сцены
    pDirect3DDevice->EndScene();       
    //  Представляем на экран 
    pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
}

 smile 

Автор: Sfate 22.12.2009, 23:07
смотри у тебя какбэ VOID DrawText(бла... бла... бла...) и там же pFont->DrawText переименуй как нить функцию, там где void...
и еще в этой же функции pDirect3DDevice->BeginScene(); и pDirect3DDevice->EndScene();  лишнее, они должны быть в только в фукции рендера, у тебя это RenderingDirect3D()...
з.ы. ща быстренько твой код подредактирую... погодь....

Автор: Stas96 22.12.2009, 23:14
VOID DrawText(бла... бла... бла...) 

1.Я cделал void DrawMyText.

2. Функцию  pDirect3DDevice->BeginScene(); и pDirect3DDevice->EndScene();  убрал.
И все равно может я подключить что-то забыл?

Автор: Sfate 22.12.2009, 23:17
Код

//  Функция
//  DrawMyText()
//  Выводит текст на экран
//--------------------------------------------------------------------------------------
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
        char* StrokaTexta,int x,int y,int x1,int y1,D3DCOLOR MyColor)
{

    int x = 10;
    int y = 20; 
    int x1 = 500;  
    int y1 = 700; 
    D3DCOLOR MyColor = D3DCOLOR_ARGB(250,250,250,50);
    // Создаем шрифт
    D3DXCreateFont(30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,L"Arial",&pFont);   
    // Координаты прямоугольника
    Rec.left = x;                            
    Rec.top  = y;
    Rec.right  = x1;
    Rec.bottom = y1;  
    // Вывод текста
    pFont->DrawText(NULL,StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
    // удаляем
    pFont->Release();
                         
}
//-----------------------------------------------------------------------------------
//  Функция
//  RenderingDirect3D()
//  Рисуем
//-----------------------------------------------------------------------------------

VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)        // Проверяем ошибки
        return;
    
    pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER,
                              D3DCOLOR_XRGB(60,100,150), 1.0f, 0 );
    // Начало сцены
    pDirect3DDevice->BeginScene();     
    
    // Здесь происходит прорисовка сцены
    LightMaterial();
    Matrix();
 
    pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) );
    pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    pDirect3DDevice->SetIndices(pBufferIndex);

    // Вывод объекта
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    // Вывод текста
     pFont->DrawMyText(pDirect3DDevice,hFont,"Лаб. раб. №3\nВращение куба\nДля выхода нажмите клавишу <Esc> ",10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));

     // Конец сцены
    pDirect3DDevice->EndScene();       
    //  Представляем на экран 
    pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
}

вот юзай должно работать... 
з.ы. мы с тобой уже по звездочке наколотили на твоем посте smile 

Автор: Stas96 22.12.2009, 23:22
Блин я с этим кодом здурею скоро smile !!!
Все равно  не работает ладно завтра на свежую голову может чето придумаю.
Sfate, Спасибо за помощь!

з.ы. Ага smile  smile  smile  smile 

Автор: Sfate 22.12.2009, 23:27
Stas96, пжл)
странно... с моим кодом работать должно... какие ошибки?

Автор: Stas96 22.12.2009, 23:28
1>e:\c++\программы\directx\directx\lesson 9.cpp(209) : error C2660: D3DXCreateFontW: функция не принимает 11 аргументов
1>e:\c++\программы\directx\directx\lesson 9.cpp(216) : error C2664: ID3DXFont::DrawTextW: невозможно преобразовать параметр 2 из 'char *' в 'LPCWSTR'
1>        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>e:\c++\программы\directx\directx\lesson 9.cpp(246) : error C2660: ID3DXFont::DrawTextW: функция не принимает 8 аргументов

Добавлено через 2 минуты и 17 секунд
Ты правда в коде  чуть неверно написал
Место:
Код

VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
        char* StrokaTexta,int x,int y,int x1,int y1,D3DCOLOR MyColor)
{
    int x = 10;
    int y = 20; 
    int x1 = 500;  
    int y1 = 700; 
    D3DCOLOR MyColor = D3DCOLOR_ARGB(250,250,250,50);

Мне кажется надо:
Код

VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
        char* StrokaTexta)
{
    int x = 10;
    int y = 20; 
    int x1 = 500;  
    int y1 = 700; 
    D3DCOLOR MyColor = D3DCOLOR_ARGB(250,250,250,50);

Автор: Sfate 22.12.2009, 23:31
со второй ошибкой понятно... перед кавычками с текстом напиши "L" без кавычек...
ты какой пакет sdk используешь не 2004 года?

Автор: Stas96 22.12.2009, 23:34
Нет... Август 2009
З.Ы Давай завтра продолжим а тут уже спать гонят( Пока)

Автор: Sfate 22.12.2009, 23:37
ок... снов...

Автор: Sfate 22.12.2009, 23:57
все отредактил... в студии компилится без ошибок и работает))
Код
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont,
        char* StrokaTexta,int x,int y,int x1,int y1,D3DCOLOR MyColor)
{
    MyColor = D3DCOLOR_ARGB(250,250,250,50);
    // Создаем шрифт
    D3DXCreateFont(pDirect3DDevice,30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,"Arial",&pFont);   
    // Координаты прямоугольника
    Rec.left = x;                            
    Rec.top  = y;
    Rec.right  = x1;
    Rec.bottom = y1;  
    // Вывод текста
    pFont->DrawText(NULL,StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
    // удаляем
    pFont->Release();
                         
}
VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)        // Проверяем ошибки
        return;
    
    pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER,
                              D3DCOLOR_XRGB(60,100,150), 1.0f, 0 );
    // Начало сцены
    pDirect3DDevice->BeginScene();     
    
    // Здесь происходит прорисовка сцены
    LightMaterial();
    Matrix();
 
    pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) );
    pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    pDirect3DDevice->SetIndices(pBufferIndex);

    // Вывод объекта
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    // Вывод текста
     DrawMyText(pDirect3DDevice,hFont,"Лаб. раб. №3\nВращение куба\nДля выхода нажмите клавишу <Esc> ",10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));

     // Конец сцены
    pDirect3DDevice->EndScene();       
    //  Представляем на экран 
    pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
}

вот теперь смело можешь юзать))
если будет ссылаться на отсутствие либы http://rghost.ru/739744 (3.7 МБ), просто добавь в директорию, куда компилиться exe-шник эту либу... XX меняешь на цифры в ошибке...

Автор: Stas96 23.12.2009, 09:56
Sfate, Спасибо большое.Опять Ошибка была но я ее исправил поставил другую кодировку)

Автор: Ferrisgeneral 11.1.2010, 14:44
а у меня выдает ошибку (код такойже как и 2-мя постами выше)

error C2664: 'ID3DXFont::DrawTextW' : cannot convert parameter 2 from 'char *' to 'LPCWSTR'

вот код где ошибка:

//Вывод текста
pFont -> DrawText(NULL,
        StrokaTexta, 
        -1,
        &Rect, 
        DT_WORDBREAK,
        MyColor);

Автор: Sfate 12.1.2010, 01:10
Ferrisgeneral, перед текстом в кавычках поставь L
т.е. если было "текст", то надо L"текст"

Автор: Ferrisgeneral 12.1.2010, 16:16
да да, спасибо ... правда и сам разобрался.

только не особо теперь понятно, почему выводится текст "StrokaTexta"  (из Вывод текста
) ..., а не та строчка текста что написана в разделе RenderingDirect3D().



вот еще одна проблемка
в строчке
UINT  Time  = timeGetTime() % 5000;

Error    1    error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "void __cdecl Matrix(void)" (?Matrix@@YAXXZ)
Error    2    fatal error LNK1120: 1 unresolved externals

если например присвоить константу, то все компилится
UINT Time = 800;

я как понимаю, просто функция не может взять системное время от начала работы винды. У меня XP Pro х64 SP2, Athlon 64 X2 6000+, 4Гб оперативы, GF 8800GT

Автор: Sfate 12.1.2010, 18:00
Цитата(Ferrisgeneral @  12.1.2010,  16:16 Найти цитируемый пост)
Error    1    error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "void __cdecl Matrix(void)" (?Matrix@@YAXXZ)Error    2    fatal error LNK1120: 1 unresolved externals
ну дык... на до было либу winmm.lib подключить...
Код
#pragma comment(lib, "winmm.lib")

Автор: Ferrisgeneral 15.1.2010, 14:00
спасибо за подсказку, не знал что что-то еще надо подключать к линковщику.


возник еще один вопрос:
при запуске проекта у меня кубик растянут по горизонтали. Может я где-то не правильно использую параметры взятого устройства (монитора). 

у меня код почти идентичный тому что в первом посте, Монитор 24" разрешение 1920х1200.

Автор: Sfate 15.1.2010, 19:43
Ferrisgeneral, замени строчку
Код
 D3DXMatrixPerspectiveFovLH( &MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
 
на 
Код
D3DXMatrixPerspectiveFovLH( &MatrixProjection, D3DX_PI/4, 1920.f / 1200.f, 1.0f, 1000.f );


просто необходимо соблюдать соотношение сторон... для разных моников оно разное... вот на досуге http://ru.wikipedia.org/wiki/Соотношение_сторон_экрана...

Автор: Ferrisgeneral 3.2.2010, 00:26
спасибо помогло, когда вбил 1.6f вместо 1.0f (3-го параметра).
правда так и не понял назначение 1-го, 2-го и 4-го параметров.


возник еще вопрос по поводу обработки клавишь клавиатуры,  ... не понимаю куда именно надо поместить InitialInput(). Догадываюсь что куда-то в WinMain, но не знаю куда именно.
http://www.sendspace.com/file/usscb1


так же есть вопрос по обработке сообщений от мыши: какое событие надо обрабатывать при вращении колесика мыши (вверх и вниз) (кнопка под колесиком вроде называется MIDDLE_BUTTON)

Автор: Sfate 5.2.2010, 02:21
Ferrisgeneral, щас... времени качать проект иль че там... нету... ближе к вечеру этого дня гляну...

Автор: Ferrisgeneral 7.2.2010, 19:28
по моим вопросикам есть какие нибудь ответы ?

Автор: Rickert 8.2.2010, 02:53
Модератор: Один топик - один вопрос, не устраивайте мусорку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)