Бесплатная реклама
06 Дек 2019 - 14:22:38
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
   Начало   Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: Текст на основе ID3DXFont и CD3DFont + Счетчик кадров
Robot

Сообщений: 653


Робот УралДев
Просмотр профиля
« : 18 Окт 2006 - 23:09:08 »

Текст на основе ID3DXFont и Счетчик кадров
Клевич Борис "wildboar"
В статье показывается как сделать простой счетчик кадров для вашего приложения,
а также использовать шрифт DirectX.


http://www.uraldev.ru/articles/index.php?id=3
« Последнее редактирование: 24 Дек 2007 - 23:09:58 от Albert MW » Записан
wildboar
Юзеры

Сообщений: 37


< Борис
Просмотр профиля WWW E-mail
« Ответ #1 : 01 Янв 2007 - 03:42:01 »

Обнаружил ошибку при разрегистрации класса:

// код с ошибкой – не удаляет класс окна
UnregisterClass("winclass", winclass.hInstance); /* не получится переключать режимы экрана и восстанавливать поверхности */


// Нужно Указывать имя класса, а не имя структуры
UnregisterClass("class1", hinstance); //разрегистрируем класс

Надеюсь, что кроме меня самого никто больше не пострадал.
Записан
wildboar
Юзеры

Сообщений: 37


< Борис
Просмотр профиля WWW E-mail
« Ответ #2 : 05 Янв 2007 - 03:55:52 »

// Отказ от вертикальной синхронизации монитора.
// В функции Инициализации Direct3D при установке параметров представления  добавьте строку:

Direct3DParam.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // выкл. vsync

// в идеале, надо было делать мультимедийный таймер...
Записан
wildboar
Юзеры

Сообщений: 37


< Борис
Просмотр профиля WWW E-mail
« Ответ #3 : 23 Июн 2007 - 20:44:19 »

Написал и Отправил администрации новую версию статьи! Надеюсь, что пересылка прошла удачно и статья проявится скоро.

Старая версия мне совсем не нравилась и содержала убийственную ошибку:
При запуске exe на мнгновенье появляется окно и затем все исчезает!

Так как 1 человек об это всё-таки спросил, то считаю, что я должен написать об этом в комментариях к своей статье.

Оказывается это происходило из-за не обнуления msg в WinMain.
В большинстве книжек об этом ни слова. А проявлял "эффект" себя через раз: то работает, то сразу вылетает.

вообщем, теперь я обнуляю всё:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG   msg={0};   // сообщения, обнулять обязательно!!!
// ещё способы обнулить: memset(&msg,0,sizeof(msg)); И ZeroMemory( &msg, sizeof(msg) );*/
Записан
Scart

Сообщений: 226


< Артем
Просмотр профиля WWW
« Ответ #4 : 14 Июл 2007 - 11:02:50 »

Будем ждать (еще ведь не вышел новый вариант?).
Записан

Все приходит с опытом...
wildboar
Юзеры

Сообщений: 37


< Борис
Просмотр профиля WWW E-mail
« Ответ #5 : 17 Июл 2007 - 00:24:08 »

Вобщем - забейте на статью, Хреного я опять написал, много мелких неточностией. Подозреваю, что администрации не понравилось.
Зато в коде всё хорошо и понятно. кнопки f1,f2,f3,f4,f5 и f6.

дополнительная ссылка по теме:
http://forum.mirgames.ru/index.php?showtopic=3937

Код:
#include <windows.h>
#include <d3d9.h>    // direct3d9
#include <d3dx9.h>    // заголовок библиотеки утилит direct3d9
#include <d3dx9core.h>    // требуется для работы с текстом ID3DXFont
#include <time.h>    // для _strtime_s() !этой функции нет в <TIME.h> у MS VC++ 6.0!
#include <stdio.h>    // для sprint
#include <string.h>     // для strlen
#include <math.h>

#pragma comment (lib,"d3d9.lib")    // библиотека direct3d9
#pragma comment (lib,"d3dx9.lib")    // библиотека утилит direct3d9

//#define D3DFVF_MYVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL)
#define D3DFVF_MYVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
#define D3DFVF_MYVERTEX2 (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL)
//указатели на интерфейсы DirectX
IDirect3D9     *pD3D = NULL;        // указатель на объект Direct3d9
IDirect3DDevice9 *pDevice = NULL;    // указатель на устройство Direct3d9
ID3DXFont     *pFont  = NULL;    // Указатель на интерфейс ID3DXFont
ID3DXFont     *pFont_Small = NULL;      // Указатель на ID3DXFont для маленького текста
IDirect3DVertexBuffer9 * pVB;
IDirect3DIndexBuffer9  * pIB;
IDirect3DVertexBuffer9 * pTB;

//глобальные переменные
HWND hwnd=NULL;            
HINSTANCE hInstance=NULL;
WNDCLASSEX wc;                 // структура для хранения класса окна
D3DPRESENT_PARAMETERS d3dpp={0};     // объявление и обнуление параметров представления D3D

int width =GetSystemMetrics(SM_CXSCREEN);// размер экрана по длине
int height=GetSystemMetrics(SM_CYSCREEN);// размер экрана по высоте
int ThrowingBones=0;        // Игровой Кубик
int NumTriangles = 12;        // количество треугольников
int NumVerts = 24;            // количество вершин
int NumInds = 36;            // количество индексов
float FPS, nextSecond, prevSecond = 0.0f;// переменные для счетчика
float Angle=0;
bool fullscreen=true;             // переключатель режима окна – (вкл. fullscreen)
bool VsyncSwitcher=false;         // переключатель vsync – (выкл. Vsync)
bool text=false;
bool cube=false;
bool tri=false;
bool vs=false;
bool eggs=false;
bool egg_screamer=false;
bool egg_hadgdog=false;
bool egg_robot=false;
bool egg_congratulation=false;
D3DCOLOR Rcolor1,Rcolor2,Rcolor3,Rcolor4;
UINT vsync=0;                 // хранит значение d3dpp.PresentationInterval
char buffer[50];               // массив размером 50 символов для текстовой строки "buffer"
char eggbuf[50];              // массив символов для текста easter eggs
char tmpbuf[128];             // массив символов для информации о системном времени !меньше 113 -> вылет!
time_t ltime;
RECT rc1={ width-80, 0, 0, 0 };
RECT rc2={0, 0, 0, 0};
RECT rc3={0, 20, 0, 0};
RECT rc4={0, 40, 0, 0};
RECT rc5={0, 60, 0, 0};
RECT rc6={0, 80, 0, 0};
RECT rc7 ={0, 100, 0, 0};
RECT rc8 ={(width/2-100), 0, 0, 0};
RECT rc9; // другой способ
RECT rc10 ={width/2-250, 400, 765, 460};
RECT rc11 ={width/2-250, 500, 750, 560};
RECT rc12 ={width/2-280, 600, 0, 0};
RECT rc20 = {294, 303, 0, 0}; // тень
RECT rc21 = {300, 300, 0, 0};

struct MyVertex
{
    float x, y, z;
    DWORD color;
};
struct MyVertex2
{
    float x, y, z;
    float nx,ny,nz;
    DWORD color;
};

MyVertex Triangle[7];

// MyVertex2 Triangle[7];
//------------------------------
// Объявление Прототипов Функций
//------------------------------
bool Quad();
// bool Triangle();
void DrawObject();
void DrawObject2();
void SetWorld();
void SetView();
void SetProjection();
void    CALLBACK OnLostDevice();
HRESULT CALLBACK OnResetDevice();
LRESULT    CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);   // Объявление WindowProc

//------------------------------
// Бонус
//------------------------------
void EasterEggs()
{
    ThrowingBones=rand()%2300;
    sprintf(eggbuf,"Подождите, Бросаю Кости %d\n", ThrowingBones);
    pFont_Small->DrawText(0,eggbuf, -1, &rc8, DT_NOCLIP|DT_WORDBREAK, D3DCOLOR_XRGB(255, 245, 55));
    if(ThrowingBones==23)
    {
        egg_hadgdog=true;
        Rcolor1=D3DCOLOR_XRGB(rand()%255, rand()%255, rand()%255);
    }
    if(ThrowingBones==57)
    {
        egg_robot=true;
        Rcolor2=D3DCOLOR_XRGB(rand()%255, rand()%255, rand()%255);
    }
    if(ThrowingBones==13|ThrowingBones==77|ThrowingBones==555)
    {
        egg_screamer=true;
        Rcolor3=D3DCOLOR_XRGB(rand()%255, rand()%255, rand()%255);
        SetRect(&rc9, rand()%width, rand()%height, 0, 0);
    }
    if(ThrowingBones==7)
    {
        egg_congratulation=true;
        Rcolor4=D3DCOLOR_XRGB(rand()%255, rand()%255, rand()%255);
    }
}

// ----------------------------------------------------
// Функция MakeSuperFont()
// Создает шрифт для вывода текста на основе ID3DXFont
//----------------------------------------------------
void MakeSuperFont( INT FontHeight, UINT FontWeight, LPCSTR pFaceName, ID3DXFont **ppd3dxFont)
{
    ID3DXFont *pFontNew = NULL;    // временный шрифт (указатель на указатель)
      D3DXCreateFont(pDevice,        // D3D device
                   FontHeight,        // Height - высота символа
                   0,            // Width - длина сивола
                   FontWeight,        // Weight - ширина
                   0,            // the number of MipLevels
                   FALSE,        // Italic – курсив
                   DEFAULT_CHARSET,    // CharSet
                   OUT_TT_ONLY_PRECIS,    // OutputPrecision (TrueType)
                   DEFAULT_QUALITY,    // Quality
                   DEFAULT_PITCH | FF_DONTCARE, // PitchAndFamily
                   pFaceName,        // наименование шрифта. Например, "Arial"
                   &pFontNew);        // ppFont - указатель на используемый интерфейс ID3DXFont
    *ppd3dxFont = pFontNew;
}

//=========================
// кубик
//=========================
bool Quad()
{
    // массив вершин
    const MyVertex VertexList[]={
        -0.5f,-0.5f,-0.5f, 0x00ff0000,
        -0.5f, 0.5f,-0.5f, 0x00ff0000,
         0.5f,-0.5f,-0.5f, 0x00ff0000,
         0.5f, 0.5f,-0.5f, 0x00ff0000,
        
         0.5f,-0.5f,-0.5f, 0x0000ff00,
         0.5f, 0.5f,-0.5f, 0x0000ff00,
         0.5f,-0.5f, 0.5f, 0x0000ff00,
         0.5f, 0.5f, 0.5f, 0x0000ff00,
        
         0.5f,-0.5f, 0.5f, 0x000000ff,
         0.5f, 0.5f, 0.5f, 0x000000ff,
        -0.5f,-0.5f, 0.5f, 0x000000ff,
        -0.5f, 0.5f, 0.5f, 0x000000ff,
        
        -0.5f,-0.5f, 0.5f, 0x00ffff00,
        -0.5f, 0.5f, 0.5f, 0x00ffff00,
        -0.5f,-0.5f,-0.5f, 0x00ffff00,
        -0.5f, 0.5f,-0.5f, 0x00ffff00,
        
        -0.5f, 0.5f,-0.5f, 0x00000000,
        -0.5f, 0.5f, 0.5f, 0x00000000,
         0.5f, 0.5f,-0.5f, 0x00000000,
         0.5f, 0.5f, 0.5f, 0x00000000,
        
         0.5f,-0.5f,-0.5f, 0x00ff00ff,
         0.5f,-0.5f, 0.5f, 0x00ff00ff,
        -0.5f,-0.5f,-0.5f, 0x00ff00ff,
        -0.5f,-0.5f, 0.5f, 0x00ff00ff,
    };

    // индексы
    const unsigned short Inds[]={
        0,1,2,2,1,3,
        4,5,6,6,5,7,
        8,9,10,10,9,11,
        12,13,14,14,13,15,
        16,17,18,18,17,19,
        20,21,22,22,21,23,
    };

    HRESULT hr;
    void * pBuf;

    // буфер вершин
    hr = pDevice->CreateVertexBuffer(sizeof(MyVertex)*NumVerts,
         0, D3DFVF_MYVERTEX, D3DPOOL_DEFAULT, &pVB, 0);
    if (FAILED(hr)) return false;

    // заполнение
    hr = pVB->Lock(0,sizeof(MyVertex)*NumVerts, &pBuf, 0);
    if (FAILED(hr)) return false;
    memcpy(pBuf, VertexList, sizeof(MyVertex) * NumVerts);
    pVB->Unlock();

    // буфер индексов
    hr=pDevice->CreateIndexBuffer(sizeof(short)*NumInds,
        //D3DUSAGE_WRITEONLY,
        0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pIB, 0);
    if(FAILED(hr)) return false;

    // заполнение
    hr=pIB->Lock(0, sizeof(short)*NumInds, &pBuf, 0);
    if(FAILED(hr)) return false;
    memcpy(pBuf, Inds, sizeof(short)*NumInds);
    pIB->Unlock();

    return true;
}

bool Triangles()
{
    Triangle[0].x= 0.7f;
    Triangle[0].y=-0.3f;
    Triangle[0].z= 0.1f;

    Triangle[1].x=-0.7f;
    Triangle[1].y=-0.3f;
    Triangle[1].z= 0.1f;

    Triangle[2].x= 0.0f;
    Triangle[2].y= 0.7f;
    Triangle[2].z= 0.1f;

    Triangle[3].x=-0.5f;
    Triangle[3].y=-0.5f;
    Triangle[3].z= 0.1f;

    Triangle[4].x=-0.5f;
    Triangle[4].y= 0.5f;
    Triangle[4].z= 0.1f;

    Triangle[5].x= 0.5f;
    Triangle[5].y= 0.5f;
    Triangle[5].z= 0.1f;

    Triangle[6].x= 0.5f;
    Triangle[6].y=-0.5f;
    Triangle[6].z= 0.1f;


    Triangle[0].color = D3DCOLOR_XRGB(0,0,255);
    Triangle[1].color = D3DCOLOR_XRGB(0,255,0);
    Triangle[2].color = D3DCOLOR_XRGB(255,0,0);
    Triangle[3].color = D3DCOLOR_ARGB(0,255,0,255);
    Triangle[4].color = D3DCOLOR_ARGB(50,0,155,255);
    Triangle[5].color = D3DCOLOR_ARGB(100,255,255,0);
    Triangle[6].color = D3DCOLOR_ARGB(200,255,255,255);

    void * pBuf;
    // буфер вершин
    if(FAILED(pDevice->CreateVertexBuffer(sizeof(MyVertex)*7,
        0, D3DFVF_MYVERTEX, D3DPOOL_DEFAULT, &pTB, 0)))
        return FALSE;

    // заполнение
    if(FAILED(pTB->Lock(0, sizeof(MyVertex)*7, &pBuf, 0)))
        return FALSE;
    memcpy(pBuf, Triangle, sizeof(MyVertex)*7);
    pTB->Unlock();
    return true;
}

void SetWorld()
{
    float b= float(Angle++)/50;
    float c = (float)cos(b);
    float s = (float)sin(b);
    float c1 = (float)cos(-b);
    float s1 = (float)sin(-b);
    float c2 = (float)cos(b/2);
    float s2 = (float)sin(b/2);

    D3DMATRIX World = {
     c*c, c*s, s, 0,
      -s,   c, 0, 0,
    -s*c,-s*s, c, 0,
       0,   0, 0, 1,
    };
    pDevice->SetTransform(D3DTS_WORLD, &World);        // мировая матрица
}

void SetWorldZ_RH()
{
    float b= float(Angle++)/50;
    float c = (float)cos(b);
    float s = (float)sin(b);
    float c1 = (float)cos(-b);
    float s1 = (float)sin(-b);
    float c2 = (float)cos(b/2);
    float s2 = (float)sin(b/2);

    D3DMATRIX World = {
    c*c2,    -s*s2, 0, 0,
    s2,     c, 0, 0,
    0,     0, 1, 0,
    0,   0, 0, 1,
    };
    pDevice->SetTransform(D3DTS_WORLD, &World);        // мировая матрица
}

void SetWorldZ_LH()
{
    float b= float(Angle++)/50;
    float c = (float)cos(b);
    float s = (float)sin(b);
    float c1 = (float)cos(-b);
    float s1 = (float)sin(-b);
    float c2 = (float)cos(b/2);
    float s2 = (float)sin(b/2);

    D3DMATRIX World={
        c1,-s1,0,0,
        s1,c1,0,0,
        0,0,1,0,
        0,0,0,1,
    };
    pDevice->SetTransform(D3DTS_WORLD, &World);
}



void SetView()
{
  D3DMATRIX View = {
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 4, 1,
  };
  pDevice->SetTransform(D3DTS_VIEW, &View);
}

void SetProjection()
{
  float Zn = 1.0f;
  float Zf = 100.0f;
  float Vw = 1;
  float Vh = (float)height/(float)width;

  D3DMATRIX Projection = {
    2*Zn/Vw, 0, 0, 0,
    0, 2*Zn/Vh, 0, 0,
    0, 0, Zf/(Zf-Zn), 1,
    0, 0, -Zf/(Zf-Zn)*Zn, 0,
  };

  pDevice->SetTransform(D3DTS_PROJECTION, &Projection);
}

//-------------------------
// Функция InitDirect3D()
// Инициализация Direct3D
//-------------------------
bool InitDirect3D(HWND hwnd)
{
    HRESULT hr=0;
    pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if( !pD3D)
    {
        if(pD3D != NULL )pD3D->Release();
        ::MessageBox(0, "Direct3DCreate9(D3D_SDK_VERSION) - Failed", 0, 0);
        return false;
    }

    D3DDISPLAYMODE Display;
    if(FAILED(pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display)))
    {
        ::MessageBox(0, "GetAdapterDisplayMode - Failed", 0, 0);
        return false;
    }

    D3DCAPS9 caps;
    if(FAILED(pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps) ) )
    {
        if( pD3D != NULL )pD3D->Release();
        ::MessageBox(0, "GetDeviceCaps() - Failed", 0, 0);
        return false;
    }

    int vp = 0;
    if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    if(VsyncSwitcher)
    {
        vsync = D3DPRESENT_INTERVAL_DEFAULT;    // переключатель  вкл. vsync
    }
    else
    {
        vsync = D3DPRESENT_INTERVAL_IMMEDIATE;    // переключатель  выкл. vsync
    }

    // Установка Параметров Представления Direct3D (обяъвление и затирание нулями перенес в глобальные переменные)
    d3dpp.Windowed            = !fullscreen;    // переключатель режима экрана
    d3dpp.BackBufferFormat        = Display.Format;
    d3dpp.EnableAutoDepthStencil    = true;
    d3dpp.AutoDepthStencilFormat    = D3DFMT_D24S8; // быстрее, чем D3DFMT_D16 на 20%
    d3dpp.BackBufferWidth        = GetSystemMetrics(SM_CXSCREEN);
    d3dpp.BackBufferHeight        = GetSystemMetrics(SM_CYSCREEN);
    d3dpp.BackBufferCount        = 1;
    if(fullscreen)
    {
        d3dpp.FullScreen_RefreshRateInHz=Display.RefreshRate;
        d3dpp.SwapEffect        = D3DSWAPEFFECT_FLIP;
    }
    else
    {
        d3dpp.FullScreen_RefreshRateInHz=0;
        d3dpp.SwapEffect        = D3DSWAPEFFECT_DISCARD;
    }

    d3dpp.PresentationInterval     = vsync;     // переключатель vsync

    hr = pD3D->CreateDevice(D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL, hwnd,
        vp,
        &d3dpp, &pDevice );
    if(FAILED(hr))
    {
        // попытаться ещё раз, используя 16-битный буфер глубины
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
        
        hr = pD3D->CreateDevice(
            D3DADAPTER_DEFAULT,
            D3DDEVTYPE_HAL,
            hwnd,
            vp,
            &d3dpp,
            &pDevice);

        if(FAILED(hr))
        {
            pD3D->Release();
            ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
            return false;
        }
    }

    pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );// Отключаем отсечение
    pDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );    // Окружающие освещенние
    pDevice->SetRenderState (D3DRS_ZENABLE, D3DZB_TRUE);    // Включаем Z буфер
    pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); // освещение выкл., перед включением - настройте материалы!

    // Создание текста
    MakeSuperFont(60, FW_BOLD, "Times New Roman", &pFont);
    MakeSuperFont(15, FW_MEDIUM, "Arial", &pFont_Small);

    Quad();
    Triangles();
    
    SetView();
    SetProjection();

    return true;// возврат из булевской функции
}

//-------------------------
// Созданиe окна
//-------------------------
bool MakeSuperWindow(bool fullscreen)
{
    if(hInstance == NULL)
        hInstance=(HINSTANCE)GetModuleHandle(NULL);
DWORD        dwExStyle;        // Window Extended Style
DWORD        dwStyle;        // Window Style
RECT        WindowRect;        // Grabs Rectangle Upper Left / Lower Right Values
WindowRect.left=(long)0;        // Set Left Value To 0
WindowRect.right=(long)width;        // Set Right Value To Requested Width
WindowRect.top=(long)0;        // Set Top Value To 0
WindowRect.bottom=(long)height;    // Set Bottom Value To Requested Height
//заполнение структуры класса окна
wc.cbSize    = sizeof(WNDCLASSEX);
wc.style    = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc    = WindowProc;    //указатель на функцию обработки сообщений
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance    = hInstance;
wc.hIcon    = LoadIcon(hInstance, "w");
wc.hCursor    = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground= 0;
wc.lpszMenuName    = 0;
wc.lpszClassName= "class1";
wc.hIconSm    = LoadIcon(hInstance, "w");
// Регистрация класса окна
if (!RegisterClassEx(&wc)) return(0);
if (fullscreen)                            // Если полноэкранный режим
    {
        dwExStyle=WS_EX_APPWINDOW;            // Window Extended Style
        dwStyle=WS_POPUP;                // Windows Style
        ShowCursor(FALSE);                // Hide Mouse
    }
    else
    {
        dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;    // Window Extended Style
        dwStyle=WS_OVERLAPPEDWINDOW;            // Windows Style
    }

    AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);// Выравнивание окна по указанным при создании размерам
// Создание окна
if (!(hwnd = CreateWindowEx(NULL,
    "class1",             // имя класса
    "ID3DXFont-Текст и Счетчик FPS", //заглавие окна
    dwStyle |WS_CLIPCHILDREN | WS_VISIBLE |WS_CLIPSIBLINGS,
    30,30,                 // начальная позиция x,y
    WindowRect.right-WindowRect.left,// вычислить длину окна
    WindowRect.bottom-WindowRect.top,// вычислить высоту окна
    0,                 // дескриптор родительского окна
    0,                 // дескриптор меню
    hInstance,             // экземпляр этого приложения
    0)))                 // дополнительный параметр - creation parms
return(0);

    ShowWindow(hwnd, SW_SHOWDEFAULT);// здесь недоработка! - ошибка, если поставить nCmdShow
    UpdateWindow(hwnd);
    InitDirect3D(hwnd);         // вызов функции Инициализация Direct3D
    return true;// возврат из булевской функции

}

//-------------------------------------------
// Функция GetFPS() версия_1 - простой таймер
// Подсчет кадров в секунду
//--------------------------------------------

void GetFPS()
{
   FPS++;
   nextSecond = GetTickCount() * 0.001f; // получаем миллисекунду (1000 миллисекунд * 0.001)
  
   // если прошла секунда, то вывести число FPS
   if(nextSecond - prevSecond >= 1.0f)
      {
          prevSecond = nextSecond;
          sprintf(buffer, "Кадров в Секунду = %.2f", FPS);
          FPS = 0;
      }
}

//--------------------------------------------------------------------------------------
// OnLostDevice - эта функция обратного вызова вызывается сразу, как Устройство Direct3D
// войдет в состояние потери(потеря устройства) и перед вызовом IDirect3DDevice9::Reset.
// Ресурсы, которые будут восстанавливаться в OnResetDevice callback
// должны освобождаться здесь, что обычно включает все ресурсы D3DPOOL_DEFAULT.
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice()
{
    if( pFont )    pFont->OnLostDevice();
    if( pFont_Small ) pFont_Small->OnLostDevice();

}

//-------------------------------------------------
// OnResetDevice - восстановление после перезапуска
//-------------------------------------------------
HRESULT CALLBACK OnResetDevice()
{
    // Восстановление шрифта
    pFont->OnResetDevice();
    pFont_Small->OnResetDevice();
    return S_OK;
}

//-----------------------
// Функция Render()
// Вывод графики на Экран
//-----------------------
void Render()
{

    HRESULT hr=0;
    // Тест потери D3D-устройства
    if( FAILED( hr = pDevice->TestCooperativeLevel() ) )
    {
        if( hr == D3DERR_DEVICELOST ) // Устройство потеряно, но перезапуск отложен. Поэтому, визуализация не возможна.
            return; // Выход из цикла, чтобы попробовать снова (примерно через миллисекунду).(подождите за дверью:у нас сейчас секс :-) )
        if( hr == D3DERR_DEVICENOTRESET ) // Устройство потеряно, сброс (перезапуск) возможен  прямо сейчас.
        {
            OnLostDevice();    // подготовить список освобождения всех ресурсов видео-памяти и содержимого задних буферов для перезапуска
            hr = pDevice->Reset(&d3dpp); // Сброс
            if( FAILED(hr) )return; // Выйти, если не получилось
            OnResetDevice(); // Создание ресурсов заново после перезапуска
        }
    return;
    }
    // Вывести operating system-style время и дату (для вывода даты укажите ещё параметры)
    _strtime_s( tmpbuf, 128 );        // не использовать в MS VC++6.0
    printf( "OS time:\t\t\t\t%s\n", tmpbuf ); // не использовать в MS VC++6.0
    GetFPS(); // вызов функции подсчета кадров
    // очистка экрана
    pDevice ->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(30,30,50), 1.0f, 0 );
    //pDevice ->Clear( 0, NULL, D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(30,30,50), 1.0f, 0 ); // прикол!!!
// Начало сцены
  pDevice ->BeginScene();
pFont_Small->DrawText(0,tmpbuf, -1, &rc1, DT_NOCLIP, D3DCOLOR_XRGB(255, 255, 255)); // не использовать в MS VC++6.0
pFont_Small->DrawText(0,buffer, -1, &rc2, DT_NOCLIP, D3DCOLOR_XRGB(225, 255, 155));
pFont_Small->DrawText(0,"<ESC> - выход", -1, &rc3, DT_NOCLIP,D3DCOLOR_XRGB(125, 255, 55));
pFont_Small->DrawText(0,"<F1> - полноэкранный/оконный режим экрана", -1, &rc4, DT_NOCLIP, D3DCOLOR_XRGB(100, 255, 100));
pFont_Small->DrawText(0,"<F2> - вкл./выкл vsync", -1, &rc5, DT_NOCLIP, D3DCOLOR_XRGB(155, 255, 200));
pFont_Small->DrawText(0,"<F3> - Easter Eggs", -1, &rc6, DT_NOCLIP, D3DCOLOR_XRGB(255,145, 145));
pFont_Small->DrawText(0,"<ALT>+<TAB> - Проверить Живучесть Программы", -1, &rc7, DT_NOCLIP, D3DCOLOR_XRGB(155,155, 155));
if(eggs) EasterEggs();//  Вызвать Функцию Easter Eggs()
if(egg_hadgdog)
    pFont_Small->DrawText(0,"Подарите мне вашего хомячка. Я буду о нем хорошо заботиться. А, когда эта скотина сдохнет, сделаю себе чехол для сотового.", -1, &rc10,DT_WORDBREAK|DT_CENTER, Rcolor1);
if(egg_robot)
    pFont_Small->DrawText(0,"Японцы долго и упорно трудились, но все-таки построили очень, очень умного робота. А он, - сделал им харакири.", -1, &rc11,DT_WORDBREAK|DT_CENTER, Rcolor2);
if(egg_screamer)
    pFont_Small->DrawText(0,"Привет!", -1, &rc9, DT_NOCLIP, Rcolor3);
if(egg_congratulation)
    pFont_Small->DrawText(0,"А это точно поможет? - Спросила Царевна Несмеяна, осторожно затягиваясь.", -1, &rc12, DT_NOCLIP, Rcolor4);
if(text)
{
    pFont->DrawText(0, "ID3DXFont::DrawText", -1, &rc20, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 0, 0) ); // тень
    pFont->DrawText(0, "ID3DXFont::DrawText", -1, &rc21, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 0) );
}
if(cube)    DrawObject();
if(tri)    DrawObject2();

// Конец сцены
  pDevice ->EndScene();
  pDevice ->Present( NULL, NULL, NULL, NULL ); // визуализировать
}

void DrawObject()
{
    SetWorld();
    pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); // формат вершин
    pDevice->SetStreamSource( 0, pVB, 0, sizeof(MyVertex) );
    pDevice->SetIndices(pIB);
    pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, NumVerts, 0, NumTriangles);
}

void DeleteObject()
{
  if(pVB) pVB->Release();
  if(pIB) pIB->Release();
  pVB = 0;
  pIB = 0;
}

void DrawObject2()
{
    pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
    //pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
    //pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
    pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
    pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);
    pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
        SetWorldZ_RH();
    pDevice->SetFVF(D3DFVF_MYVERTEX); // формат вершин
    pDevice->SetStreamSource( 0, pTB, 0, sizeof(MyVertex) );
    pDevice->SetVertexShader(NULL);
    pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    SetWorldZ_LH();
    pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,3,2);
    pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,DWORD(FALSE));
    pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
}

void DeleteObject2()
{
  if(pTB) pTB->Release();
  pTB = 0;
 }
//----------------------------------------------
// Функция Release3D()
// Освобождает использованные программой ресурсы
//----------------------------------------------
void Release3D()
{
DeleteObject();
DeleteObject2();
if(pFont !=NULL)    {pFont->Release();pFont=0;}
if(pFont_Small !=NULL)    {pFont_Small->Release();pFont_Small=0;}
if(pDevice  != NULL)     {pDevice ->Release();pDevice=0;}
if(pD3D != NULL)    {pD3D ->Release();pD3D=0;}
if(fullscreen)
    {
        ChangeDisplaySettings(NULL,0);
        ShowCursor(TRUE);
    }
if (hwnd && !DestroyWindow(hwnd))    // Разрушить Окно
    {
        MessageBox(NULL,"Не удалось освободить hwnd","Ошибка Освобождения Ресурсов",MB_OK | MB_ICONINFORMATION);
        hwnd=0;                            
    }
    DestroyIcon(wc.hIcon);
    DestroyIcon(wc.hIconSm);
    UnregisterClass("class1", wc.hInstance); // Разрегистровать класс
}

//-------------------
// Обработчик событий
//-------------------
LRESULT CALLBACK WindowProc(HWND hwnd,        // Дескриптор окна
                UINT msg,    // Идентификатор сообщения
                WPARAM wParam,     // информация о сообщении
                LPARAM lParam)    // информация о сообщении
{    
    switch(msg)
    {
        case WM_KEYDOWN:
        {
            if(wParam==VK_ESCAPE)
            {
            PostQuitMessage(0);            // выход из программы
            }
            if (wParam==VK_F1)            // если нажата клавиша F1
            {
                Release3D();            // Destroy All
                fullscreen=!fullscreen;        // переключить Полноэкранный/Оконный Режим
                // Заново создать окно
                if (!MakeSuperWindow(fullscreen))
                {
                    MessageBox(NULL,"Не могу переключить режим экрана","Ошибка переключения экрана",MB_OK | MB_ICONINFORMATION);
                    return 0;                        // Если не удалось создать Окно, то выйти
                }
            }
            if(wParam==VK_F2)            // если нажата клавиша F2
            {
                Release3D();            // Destroy All
                VsyncSwitcher=!VsyncSwitcher;    // переключить VsyncSwitcher
                // Заново создать окно
                if(!MakeSuperWindow(fullscreen))
                {
                    MessageBox(NULL,"Не могу переключить режим экрана","Ошибка переключения экрана",MB_OK | MB_ICONINFORMATION);
                    return 0;        // Если не удалось создать Окно, то выйти
                }
            }
            if(wParam==VK_F3)            // если нажата клавиша F3
            {
                eggs=!eggs;
            }
            if(wParam==VK_F4)            // если нажата клавиша F3
            {
                text=!text;
            }
            if(wParam==VK_F5)
            {
                cube=!cube;
            }
            if(wParam==VK_F6)
            {
                tri=!tri;
            }
            if(wParam==VK_F7)
            {
                vs=!vs;
            }
        }break;    
        case WM_CLOSE:
        {
            PostQuitMessage(0);        // выход из программы
            return 0;
        } break;
    }// конец switch
    return DefWindowProc(hwnd, msg, wParam, lParam); // остальные сообщения
} // конец WindowProc

//-----------------
// WinMain()
//-----------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG    msg={0};    // сообщения, обнулять обязательно!!!
/* ещё способы обнулить: memset(&msg,0,sizeof(msg)); И ZeroMemory( &msg, sizeof(msg) );*/
// Спросить о режиме экрана
    if(MessageBox(NULL,"Запускать в полноэкранном режиме?", "FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
    {
        fullscreen=FALSE;    //Если нажать на кнопку 'Нет', то оконный режим экрана
    }
// вызов функции создания окна
    if(!MakeSuperWindow(fullscreen))// Create Our DirectX 3D Window
    {
        return 0;        // Если не удалось создать Окно, то выйти
    }
// Вход в главный цикл событий c использованием PeekMessage()
    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
            {
                if(GetMessage(&msg,NULL,0,0))        // !почему-то в примере [b]wat[/b]'a без этого виснет, но мне кажется, что это может затормозить прогу (лишняя проверка)!
                    {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                    }
            }
    else Render();
    } // Конец цикла событий while
// Возвращение в Windows и освобождение ресурсов
    Release3D();            // Вызов функции Release3D()
    return (int)msg.wParam;
}// Конец WinMain

Записан
Страниц: [1]
  Печать  
 
Перейти в: