Вобщем - забейте на статью, Хреного я опять написал, много мелких неточностией. Подозреваю, что администрации не понравилось.
Зато в коде всё хорошо и понятно. кнопки 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